Prepare county level data
Merge data
# create sequence of dates
date_sequence <- seq.Date(min(df_us_socdist$date),
as.Date('2020-04-28'), 1)
# create data frame with time sequence
df_dates = data.frame(date_sequence, 1:length(date_sequence))
names(df_dates) <- c('date', 'time')
# join data frames
df_us_socdist <- df_us_socdist %>%
plyr::join(df_us_ctrl, by='county_fips') %>%
plyr::join(df_us_pers, by='county_fips') %>%
inner_join(df_dates, by='date') %>%
arrange(county_fips, date)
fips_complete <- df_us_socdist %>%
group_by(county_fips) %>%
summarize(n = n()) %>%
filter(! n<max(n)) %>% .$county_fips
df_us_socdist <- df_us_socdist %>%
filter(county_fips %in% fips_complete)
df_us_socdist
Control for weekend effect
easter <- seq.Date(as.Date('2020-04-10'), as.Date('2020-04-13'), 1)
df_us_loess <- df_us_socdist %>%
mutate(weekday = format(date, '%u')) %>%
filter(!weekday %in% c('6','7') | date %in% easter) %>%
split(.$county_fips) %>%
map(~ loess(socdist_single_tile ~ time, data = .)) %>%
map(predict, 1:max(df_us_socdist$time)) %>%
bind_rows() %>%
gather(key = 'county_fips', value = 'loess') %>%
group_by(county_fips) %>%
mutate(time = row_number())
df_us_loess_2 <- df_us_socdist %>%
mutate(weekday = format(date, '%u')) %>%
filter(!weekday %in% c('6','7') | date %in% easter) %>%
split(.$county_fips) %>%
map(~ loess(socdist_tiles ~ time, data = .)) %>%
map(predict, 1:max(df_us_socdist$time)) %>%
bind_rows() %>%
gather(key = 'county_fips', value = 'loess') %>%
rename(loess_2 = loess) %>%
group_by(county_fips) %>%
mutate(time = row_number())
df_us_socdist <- df_us_socdist %>%
merge(df_us_loess, by=c('county_fips', 'time')) %>%
merge(df_us_loess_2, by=c('county_fips', 'time')) %>%
mutate(weekday = format(date, '%u')) %>%
mutate(socdist_single_tile_clean = ifelse(weekday %in% c('6','7') | date %in% easter,
loess, socdist_single_tile),
socdist_tiles_clean = ifelse(weekday %in% c('6','7') | date %in% easter,
loess_2, socdist_tiles)) %>%
arrange(county_fips, time) %>%
select(-weekday)
df_us_socdist <- df_us_socdist %>% drop_na() %>% mutate(time = time-1)
Plot prevalence over time
df_us_prev %>% sample_n(20000) %>%
ggplot(aes(x=time, y=rate_day)) +
geom_point(aes(col=county_fips, size=popdens)) +
geom_smooth(method="loess", se=T) +
theme(legend.position="none") +
ggtitle("Overall prevalence over time")

pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')
for (i in pers){
gg <- df_us_prev %>%
mutate(prev_tail = cut(.[[i]],
breaks = c(-Inf, quantile(.[[i]], 0.05, na.rm=T),
quantile(.[[i]], 0.95, na.rm=T), Inf),
labels = c('lower tail', 'center', 'upper tail'))) %>%
filter(prev_tail != 'center') %>%
ggplot(aes(x=time, y=rate_day)) +
geom_point(aes(col=county_fips, size=popdens)) +
geom_smooth(method="loess", se=T) +
facet_wrap(~prev_tail) +
theme(legend.position="none") +
ggtitle(i)
print(gg)
}





Plot social distancing single tile visited
df_us_socdist %>% sample_n(10000) %>%
ggplot(aes(x=time, y=socdist_single_tile_clean)) +
geom_point(aes(col=county_fips, size=popdens)) +
geom_smooth(method="loess", se=T) +
theme(legend.position="none") +
ggtitle("Overall social distancing (single tile) over time")

pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')
for (i in pers){
gg <- df_us_socdist %>%
mutate(dist_tail = cut(.[[i]],
breaks = c(-Inf, quantile(.[[i]], 0.05, na.rm = T),
quantile(.[[i]], 0.95, na.rm = T), Inf),
labels = c('lower tail', 'center', 'upper tail'))) %>%
filter(dist_tail != 'center') %>%
ggplot(aes(x=time, y=socdist_single_tile_clean)) +
geom_point(aes(col=county_fips, size=popdens)) +
geom_smooth(method="loess", se=T) +
facet_wrap(~dist_tail) +
theme(legend.position="none") +
ggtitle(i)
print(gg)
}





df_us_socdist %>% sample_n(10000) %>%
ggplot(aes(x=time, y=socdist_tiles_clean)) +
geom_point(aes(col=county_fips, size=popdens)) +
geom_smooth(method="loess", se=T) +
theme(legend.position="none") +
ggtitle("Overall social distancing (single tile) over time")

pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')
for (i in pers){
gg <- df_us_socdist %>%
mutate(dist_tail = cut(.[[i]],
breaks = c(-Inf, quantile(.[[i]], 0.05, na.rm = T),
quantile(.[[i]], 0.95, na.rm = T), Inf),
labels = c('lower tail', 'center', 'upper tail'))) %>%
filter(dist_tail != 'center') %>%
ggplot(aes(x=time, y=socdist_tiles_clean)) +
geom_point(aes(col=county_fips, size=popdens)) +
geom_smooth(method="loess", se=T) +
facet_wrap(~dist_tail) +
theme(legend.position="none") +
ggtitle(i)
print(gg)
}





Example plots
df_us_socdist <- df_us_socdist %>%
mutate(socdist_single_tile = socdist_single_tile_clean,
socdist_tiles = socdist_tiles_clean) %>%
select(-loess, -loess_2, -socdist_single_tile_clean, -socdist_tiles_clean)
df_us_prev %>% select(-time, -date) %>%
group_by(county_fips) %>%
summarize_if(is.numeric, mean) %>%
select(-county_fips) %>%
cor(use='pairwise.complete.obs') %>%
round(3) %>% as.data.frame()
df_us_socdist %>% select(-time, -date) %>%
group_by(county_fips) %>%
summarize_if(is.numeric, mean) %>%
select(-county_fips) %>%
cor(use='pairwise.complete.obs') %>%
round(3) %>% as.data.frame()
NA
lvl2_scaled <- df_us_prev %>%
select(-time, -date, -rate_day) %>%
distinct() %>%
mutate_at(vars(-county_fips), scale)
lvl1_scaled <- df_us_prev %>% select(county_fips, time, rate_day)
df_us_prev_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'county_fips')
df_us_socdist <- df_us_socdist %>%
mutate(socdist_single_tile = socdist_single_tile_clean,
socdist_tiles = socdist_tiles_clean) %>%
select(-loess, -loess_2, -socdist_single_tile_clean, -socdist_tiles_clean)
Correlations
lvl2_scaled <- df_us_socdist %>%
select(-time, -date, -socdist_tiles, -socdist_single_tile) %>%
distinct() %>%
mutate_at(vars(-county_fips), scale)
lvl1_scaled <- df_us_socdist %>%
select(county_fips, time, socdist_single_tile, socdist_tiles)
df_us_socdist_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'county_fips')
Rescale Data
# get onset day
df_us_onset_prev <- df_us_prev_scaled %>%
group_by(county_fips) %>%
mutate(rate_cs = cumsum(rate_day)) %>%
filter(rate_cs > 0) %>%
summarize(onset_prev = min(time)) %>%
mutate(county_fips = as.character(county_fips))
# merge with county data
df_us_onset_prev <- df_us_prev_scaled %>%
select(-time, -rate_day) %>%
distinct() %>%
mutate(county_fips = as.character(county_fips)) %>%
left_join(df_us_onset_prev, by = 'county_fips')
# handle censored data
df_us_onset_prev <- df_us_onset_prev %>%
mutate(event = ifelse(is.na(onset_prev), 0, 1)) %>%
mutate(onset_prev = replace_na(onset_prev, as.numeric(diff(range(df_us_prev$date)))+1))
lvl2_scaled <- df_us_socdist %>%
select(-time, -date, -socdist_tiles, -socdist_single_tile) %>%
distinct() %>%
mutate_at(vars(-county_fips), scale)
lvl1_scaled <- df_us_socdist %>%
select(county_fips, time, socdist_single_tile, socdist_tiles)
df_us_socdist_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'county_fips')
Predict Prevalence
Explore distributions
# predict slopes from personality
lm_slope_prev <- lm(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_us_slope_prev)
lm_slope_prev %>% summary()
Call:
lm(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a +
pers_n, data = df_us_slope_prev)
Residuals:
Min 1Q Median 3Q Max
-2.8951 -0.6401 -0.0422 0.5718 3.4926
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.01667 0.01996 -0.835 0.404
pers_o 0.26702 0.02277 11.726 < 2e-16 ***
pers_c 0.01018 0.02759 0.369 0.712
pers_e 0.09140 0.02290 3.992 6.76e-05 ***
pers_a 0.02662 0.02812 0.947 0.344
pers_n -0.11496 0.02584 -4.450 9.02e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.9472 on 2253 degrees of freedom
Multiple R-squared: 0.1048, Adjusted R-squared: 0.1028
F-statistic: 52.75 on 5 and 2253 DF, p-value: < 2.2e-16
lm_slope_prev %>% confint(level=0.9)
5 % 95 %
(Intercept) -0.04951426 0.01617791
pers_o 0.22954727 0.30449288
pers_c -0.03522143 0.05558882
pers_e 0.05372148 0.12907279
pers_a -0.01965013 0.07289248
pers_n -0.15747983 -0.07244929
# predict slopes from personality with controls
lm_slope_prev_ctrl <- lm(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc +
onset_prev,
data = df_us_slope_prev)
lm_slope_prev_ctrl %>% summary()
Call:
lm(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a +
pers_n + airport_distance + republican + medage + male +
popdens + manufact + tourism + academics + medinc + physician_pc +
onset_prev, data = df_us_slope_prev)
Residuals:
Min 1Q Median 3Q Max
-5.7005 -0.4837 -0.0430 0.4396 4.3316
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.068070 0.017031 -3.997 6.63e-05 ***
pers_o 0.037036 0.021795 1.699 0.08939 .
pers_c 0.047875 0.022496 2.128 0.03343 *
pers_e 0.022047 0.018639 1.183 0.23699
pers_a 0.046081 0.023623 1.951 0.05122 .
pers_n 0.031360 0.022704 1.381 0.16733
airport_distance -0.135510 0.022505 -6.021 2.02e-09 ***
republican -0.118138 0.020286 -5.824 6.59e-09 ***
medage -0.133828 0.018098 -7.395 1.99e-13 ***
male -0.049010 0.021397 -2.291 0.02208 *
popdens 0.096092 0.016690 5.757 9.71e-09 ***
manufact -0.006815 0.019549 -0.349 0.72739
tourism 0.012977 0.021499 0.604 0.54617
academics -0.142904 0.030820 -4.637 3.74e-06 ***
medinc 0.183557 0.026380 6.958 4.51e-12 ***
physician_pc -0.047652 0.017896 -2.663 0.00781 **
onset_prev -0.428032 0.020786 -20.592 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.7568 on 2242 degrees of freedom
Multiple R-squared: 0.4314, Adjusted R-squared: 0.4273
F-statistic: 106.3 on 16 and 2242 DF, p-value: < 2.2e-16
lm_slope_prev_ctrl %>% confint(level=0.9)
5 % 95 %
(Intercept) -0.096094777 -0.04004524
pers_o 0.001172681 0.07289998
pers_c 0.010857177 0.08489190
pers_e -0.008623806 0.05271706
pers_a 0.007207823 0.08495406
pers_n -0.005999178 0.06871970
airport_distance -0.172542458 -0.09847698
republican -0.151519389 -0.08475717
medage -0.163608583 -0.10404834
male -0.084219727 -0.01380084
popdens 0.068628060 0.12355653
manufact -0.038983249 0.02535238
tourism -0.022400681 0.04835494
academics -0.193619372 -0.09218857
medinc 0.140148361 0.22696623
physician_pc -0.077099345 -0.01820385
onset_prev -0.462237042 -0.39382737
Predict COVID onset with time-to-event regression
# predict onset from personality
cox_onset_prev <- coxph(Surv(onset_prev, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_us_onset_prev)
cox_onset_prev %>% summary()
# predict onset from personality with controls
cox_onset_prev_ctrl <- coxph(Surv(onset_prev, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc,
data = df_us_onset_prev)
cox_onset_prev_ctrl %>% summary()
Predict prevalence slopes with linear models
# predict slopes from personality
tobit_slope_prev <- censReg(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n,
left = min(df_us_slope_prev_cens$slope_prev), right = Inf,
data = df_us_slope_prev_cens)
tobit_slope_prev %>% summary()
Call:
censReg(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a +
pers_n, left = min(df_us_slope_prev_cens$slope_prev), right = Inf,
data = df_us_slope_prev_cens)
Observations:
Total Left-censored Uncensored Right-censored
2237 6 2231 0
Coefficients:
Estimate Std. error t value Pr(> t)
(Intercept) -0.01884 0.02006 -0.939 0.347772
pers_o 0.27674 0.02296 12.054 < 2e-16 ***
pers_c 0.01671 0.02778 0.601 0.547523
pers_e 0.10728 0.02319 4.625 3.74e-06 ***
pers_a 0.01551 0.02845 0.545 0.585543
pers_n -0.10392 0.02607 -3.986 6.72e-05 ***
logSigma -0.05453 0.01498 -3.640 0.000273 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Newton-Raphson maximisation, 3 iterations
Return code 1: gradient close to zero
Log-likelihood: -3052.156 on 7 Df
tobit_slope_prev %>% confint(level=0.9)
5 % 95 %
(Intercept) -0.05183356 0.01416185
pers_o 0.23897737 0.31450381
pers_c -0.02898477 0.06240249
pers_e 0.06912983 0.14542999
pers_a -0.03128303 0.06231182
pers_n -0.14680511 -0.06103538
logSigma -0.07917392 -0.02988752
# predict slopes from personality with controls
tobit_slope_prev_ctrl <- censReg(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc +
onset_prev,
left = min(df_us_slope_prev_cens$slope_prev), right = Inf,
data = df_us_slope_prev_cens)
tobit_slope_prev_ctrl %>% summary()
Call:
censReg(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a +
pers_n + airport_distance + republican + medage + male +
popdens + manufact + tourism + academics + medinc + physician_pc +
onset_prev, left = min(df_us_slope_prev_cens$slope_prev),
right = Inf, data = df_us_slope_prev_cens)
Observations:
Total Left-censored Uncensored Right-censored
2237 6 2231 0
Coefficients:
Estimate Std. error t value Pr(> t)
(Intercept) -0.066292 0.016999 -3.900 9.63e-05 ***
pers_o 0.037621 0.021789 1.727 0.0842 .
pers_c 0.051433 0.022403 2.296 0.0217 *
pers_e 0.034091 0.018704 1.823 0.0683 .
pers_a 0.036618 0.023654 1.548 0.1216
pers_n 0.036382 0.022615 1.609 0.1077
airport_distance -0.129827 0.022412 -5.793 6.93e-09 ***
republican -0.114034 0.020184 -5.650 1.61e-08 ***
medage -0.124353 0.018030 -6.897 5.30e-12 ***
male -0.041640 0.021246 -1.960 0.0500 .
popdens 0.110682 0.016589 6.672 2.52e-11 ***
manufact -0.013706 0.019420 -0.706 0.4803
tourism 0.007299 0.021471 0.340 0.7339
academics -0.146510 0.030592 -4.789 1.67e-06 ***
medinc 0.172215 0.026205 6.572 4.97e-11 ***
physician_pc -0.044685 0.017889 -2.498 0.0125 *
onset_prev -0.450417 0.020633 -21.829 < 2e-16 ***
logSigma -0.290067 0.014981 -19.362 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Newton-Raphson maximisation, 4 iterations
Return code 2: successive function values within tolerance limit
Log-likelihood: -2526.32 on 18 Df
tobit_slope_prev_ctrl %>% confint(level=0.9)
5 % 95 %
(Intercept) -0.0942521972 -0.038331633
pers_o 0.0017801165 0.073460914
pers_c 0.0145836752 0.088282659
pers_e 0.0033263545 0.064856355
pers_a -0.0022888725 0.075525539
pers_n -0.0008167478 0.073580311
airport_distance -0.1666914394 -0.092961616
republican -0.1472344136 -0.080833897
medage -0.1540092486 -0.094697335
male -0.0765867008 -0.006693169
popdens 0.0833962602 0.137967837
manufact -0.0456494616 0.018237042
tourism -0.0280170988 0.042615471
academics -0.1968297667 -0.096190872
medinc 0.1291117067 0.215317728
physician_pc -0.0741096257 -0.015260579
onset_prev -0.4843554389 -0.416477572
logSigma -0.3147085015 -0.265424820
Predict prevalence slopes with censored regression
ctrls <- cforest_unbiased(ntree=500, mtry=5)
crf_slope_prev <- cforest(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc +
onset_prev,
data = df_us_slope_prev,
controls = ctrls)
crf_slope_prev_varimp <- varimp(crf_slope_prev, nperm = 1)
crf_slope_prev_varimp_cond <- varimp(crf_slope_prev, conditional = T, nperm = 1)
crf_slope_prev_varimp
pers_o pers_c pers_e pers_a
0.009038452 0.005962953 0.002011857 0.006557738
pers_n airport_distance republican medage
0.005014302 0.015549759 0.017518869 0.028666088
male popdens manufact tourism
0.007709733 0.146701401 0.015152517 0.003916224
academics medinc physician_pc onset_prev
0.010309543 0.012499734 0.002298431 0.355694241
crf_slope_prev_varimp %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

crf_slope_prev_varimp_cond
pers_o pers_c pers_e pers_a
0.014171474 0.005819250 0.002895896 0.006566015
pers_n airport_distance republican medage
0.006903428 0.017787026 0.019239684 0.031186235
male popdens manufact tourism
0.007856779 0.158747164 0.014515458 0.005271982
academics medinc physician_pc onset_prev
0.014177035 0.014597721 0.003466332 0.399068410
crf_slope_prev_varimp_cond %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

CRF predicting slopes
ctrls <- cforest_unbiased(ntree=500, mtry=5)
crf_slope_prev <- cforest(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc +
onset_prev,
data = df_us_slope_prev,
controls = ctrls)
crf_slope_prev_varimp <- varimp(crf_slope_prev, nperm = 1)
crf_slope_prev_varimp_cond <- varimp(crf_slope_prev, conditional = T, nperm = 1)
crf_slope_prev_varimp
crf_slope_prev_varimp %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))
crf_slope_prev_varimp_cond
crf_slope_prev_varimp_cond %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))
Predict Social Distancing
Change point analysis
# keep only counties with full data
fips_complete <- df_us_socdist_scaled %>%
group_by(county_fips) %>%
summarize(n = n()) %>%
filter(n==max(.$n)) %>%
.$county_fips
# run changepoint analysis
df_us_socdist_cpt_results <- df_us_socdist_scaled %>%
select(county_fips, socdist_single_tile) %>%
filter(county_fips %in% fips_complete) %>%
split(.$county_fips) %>%
map(~ cpt.meanvar(as.vector(.$socdist_single_tile),
#penalty = 'Asymptotic',
class=TRUE,
param.estimates=TRUE,
Q=1,
test.stat = 'Normal'))
df_us_socdist_cpt_results_2 <- df_us_socdist_scaled %>%
select(county_fips, socdist_tiles) %>%
filter(county_fips %in% fips_complete) %>%
split(.$county_fips) %>%
map(~ cpt.meanvar(as.vector(.$socdist_tiles),
#penalty = 'Asymptotic',
class=TRUE,
param.estimates=TRUE,
Q=1,
test.stat = 'Normal'))
# calculate change point
df_us_socdist_cpt_day <- df_us_socdist_cpt_results %>%
map(cpts) %>%
unlist() %>%
as.data.frame() %>%
rename(cpt_day_socdist = '.') %>%
rownames_to_column('county_fips')
df_us_socdist_cpt_day_2 <- df_us_socdist_cpt_results_2 %>%
map(cpts) %>%
unlist() %>%
as.data.frame() %>%
rename(cpt_day_socdist_2 = '.') %>%
rownames_to_column('county_fips')
# calculate mean differences
df_us_socdist_cpt_mean_diff <- df_us_socdist_cpt_results %>%
map(param.est) %>%
map(~ .$mean) %>%
map(~ .[2]) %>%
unlist() %>%
as.data.frame() %>%
rename(mean_diff_socdist = '.') %>%
rownames_to_column('county_fips')
df_us_socdist_cpt_mean_diff_2 <- df_us_socdist_cpt_results_2 %>%
map(param.est) %>%
map(~ .$mean) %>%
map(~ -.[2]) %>%
unlist() %>%
as.data.frame() %>%
rename(mean_diff_socdist_2 = '.') %>%
rownames_to_column('county_fips')
# calculate means
df_us_socdist_mean <- df_us_socdist_scaled %>%
group_by(county_fips) %>%
summarize(mean_socdist = mean(socdist_single_tile))
df_us_socdist_mean_2 <- df_us_socdist_scaled %>%
group_by(county_fips) %>%
summarize(mean_socdist_2 = -mean(socdist_tiles))
# merge with county data
df_us_cpt_socdist <- df_us_socdist_scaled %>%
select(-time, -socdist_single_tile, -socdist_tiles) %>%
distinct() %>%
left_join(df_us_socdist_cpt_day, by='county_fips') %>%
left_join(df_us_socdist_cpt_day_2, by='county_fips') %>%
left_join(df_us_socdist_cpt_mean_diff, by='county_fips') %>%
left_join(df_us_socdist_cpt_mean_diff_2, by='county_fips') %>%
left_join(df_us_socdist_mean, by='county_fips') %>%
left_join(df_us_socdist_mean_2, by='county_fips') %>%
left_join(select(df_us_onset_prev, county_fips, onset_prev), by='county_fips') %>%
left_join(select(df_us_slope_prev, county_fips, slope_prev), by='county_fips')
# standardize mean/var differences
df_us_cpt_socdist <- df_us_cpt_socdist %>%
mutate(mean_diff_socdist = scale(mean_diff_socdist),
mean_diff_socdist_2 = scale(mean_diff_socdist_2),
mean_socdist = scale(mean_socdist),
mean_socdist_2 = scale(mean_socdist_2))
# handle censored data
df_us_cpt_socdist <- df_us_cpt_socdist %>%
mutate(cpt_day_socdist = ifelse(is.na(cpt_day_socdist), as.numeric(diff(range(df_us_socdist$date))), cpt_day_socdist)) %>%
mutate(event = ifelse(cpt_day_socdist >= as.numeric(diff(range(df_us_socdist$date))), 0, 1))
df_us_cpt_socdist$cpt_day_socdist %>% hist()
df_us_cpt_socdist$mean_diff_socdist %>% hist()
df_us_cpt_socdist$mean_socdist %>% hist()
df_us_cpt_socdist$cpt_day_socdist_2 %>% hist()
df_us_cpt_socdist$mean_diff_socdist_2 %>% hist()
df_us_cpt_socdist$mean_socdist_2 %>% hist()
# predict hazard from personality
cox_cpt_socdist <- coxph(Surv(cpt_day_socdist, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_us_cpt_socdist)
cox_cpt_socdist %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c +
pers_e + pers_a + pers_n, data = df_us_cpt_socdist)
n= 2380, number of events= 2379
coef exp(coef) se(coef) z Pr(>|z|)
pers_o -0.189086 0.827715 0.023503 -8.045 8.61e-16 ***
pers_c -0.033629 0.966931 0.027365 -1.229 0.21912
pers_e 0.004178 1.004187 0.023905 0.175 0.86126
pers_a -0.084190 0.919256 0.028674 -2.936 0.00332 **
pers_n 0.060781 1.062667 0.027280 2.228 0.02588 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 0.8277 1.2081 0.7905 0.8667
pers_c 0.9669 1.0342 0.9164 1.0202
pers_e 1.0042 0.9958 0.9582 1.0524
pers_a 0.9193 1.0878 0.8690 0.9724
pers_n 1.0627 0.9410 1.0073 1.1210
Concordance= 0.593 (se = 0.007 )
Likelihood ratio test= 121.9 on 5 df, p=<2e-16
Wald test = 124.3 on 5 df, p=<2e-16
Score (logrank) test = 123.9 on 5 df, p=<2e-16
# predict hazard from personality with controls
cox_cpt_socdist_ctrl <- coxph(Surv(cpt_day_socdist, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc +
onset_prev + slope_prev ,
data = df_us_cpt_socdist)
cox_cpt_socdist_ctrl %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c +
pers_e + pers_a + pers_n + airport_distance + republican +
medage + male + popdens + manufact + tourism + academics +
medinc + physician_pc + onset_prev + slope_prev, data = df_us_cpt_socdist)
n= 2196, number of events= 2195
(184 observations deleted due to missingness)
coef exp(coef) se(coef) z Pr(>|z|)
pers_o -0.079525 0.923555 0.029478 -2.698 0.006981 **
pers_c -0.036833 0.963837 0.028968 -1.272 0.203550
pers_e 0.010726 1.010783 0.025616 0.419 0.675430
pers_a -0.086909 0.916761 0.031916 -2.723 0.006468 **
pers_n 0.024748 1.025056 0.031361 0.789 0.430049
airport_distance 0.004603 1.004614 0.026869 0.171 0.863972
republican 0.010261 1.010314 0.026991 0.380 0.703818
medage 0.007869 1.007900 0.022040 0.357 0.721057
male 0.002735 1.002739 0.023670 0.116 0.908011
popdens -0.225041 0.798483 0.068056 -3.307 0.000944 ***
manufact 0.099373 1.104478 0.024223 4.102 4.09e-05 ***
tourism -0.075111 0.927641 0.026289 -2.857 0.004275 **
academics 0.123576 1.131536 0.042617 2.900 0.003735 **
medinc -0.033975 0.966596 0.036184 -0.939 0.347760
physician_pc -0.015227 0.984888 0.025260 -0.603 0.546629
onset_prev -0.004160 0.995849 0.003406 -1.221 0.222018
slope_prev -0.241254 0.785642 0.028769 -8.386 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 0.9236 1.0828 0.8717 0.9785
pers_c 0.9638 1.0375 0.9106 1.0201
pers_e 1.0108 0.9893 0.9613 1.0628
pers_a 0.9168 1.0908 0.8612 0.9759
pers_n 1.0251 0.9756 0.9639 1.0900
airport_distance 1.0046 0.9954 0.9531 1.0589
republican 1.0103 0.9898 0.9583 1.0652
medage 1.0079 0.9922 0.9653 1.0524
male 1.0027 0.9973 0.9573 1.0504
popdens 0.7985 1.2524 0.6988 0.9124
manufact 1.1045 0.9054 1.0533 1.1582
tourism 0.9276 1.0780 0.8811 0.9767
academics 1.1315 0.8838 1.0409 1.2301
medinc 0.9666 1.0346 0.9004 1.0376
physician_pc 0.9849 1.0153 0.9373 1.0349
onset_prev 0.9958 1.0042 0.9892 1.0025
slope_prev 0.7856 1.2728 0.7426 0.8312
Concordance= 0.627 (se = 0.008 )
Likelihood ratio test= 254.1 on 17 df, p=<2e-16
Wald test = 239.4 on 17 df, p=<2e-16
Score (logrank) test = 244.1 on 17 df, p=<2e-16
for(i in head(df_us_socdist_cpt_results_2, 5)){
plot(i)
}
Predicting change points with time-to-event regression
lm_meandiff_socdist <- lm(mean_diff_socdist ~
pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_us_cpt_socdist)
lm_meandiff_socdist %>% summary()
Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a +
pers_n, data = df_us_cpt_socdist)
Residuals:
Min 1Q Median 3Q Max
-3.2026 -0.5902 -0.0725 0.5561 5.2119
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -8.612e-16 1.865e-02 0.000 1.000000
pers_o 3.542e-01 2.022e-02 17.515 < 2e-16 ***
pers_c -1.084e-01 2.530e-02 -4.284 1.91e-05 ***
pers_e 8.717e-02 2.080e-02 4.191 2.88e-05 ***
pers_a -9.711e-02 2.583e-02 -3.760 0.000174 ***
pers_n 9.444e-02 2.360e-02 4.002 6.48e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.9098 on 2374 degrees of freedom
Multiple R-squared: 0.174, Adjusted R-squared: 0.1723
F-statistic: 100 on 5 and 2374 DF, p-value: < 2.2e-16
lm_meandiff_socdist %>% confint(level=0.9)
5 % 95 %
(Intercept) -0.03068621 0.03068621
pers_o 0.32088919 0.38743637
pers_c -0.15000916 -0.06674567
pers_e 0.05294230 0.12139944
pers_a -0.13960649 -0.05460713
pers_n 0.05560451 0.13326663
lm_meandiff_socdist_ctrl <- lm(mean_diff_socdist ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc +
onset_prev + slope_prev ,
data = df_us_cpt_socdist)
lm_meandiff_socdist_ctrl %>% summary()
Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a +
pers_n + airport_distance + republican + medage + male +
popdens + manufact + tourism + academics + medinc + physician_pc +
onset_prev + slope_prev, data = df_us_cpt_socdist)
Residuals:
Min 1Q Median 3Q Max
-2.5265 -0.4524 -0.0495 0.4317 3.7339
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.384566 0.157347 2.444 0.014602 *
pers_o 0.050637 0.019835 2.553 0.010749 *
pers_c -0.038501 0.020805 -1.851 0.064371 .
pers_e 0.030966 0.017349 1.785 0.074418 .
pers_a -0.067550 0.022233 -3.038 0.002407 **
pers_n 0.193759 0.021160 9.157 < 2e-16 ***
airport_distance -0.053213 0.016944 -3.140 0.001709 **
republican -0.206865 0.018365 -11.264 < 2e-16 ***
medage 0.316357 0.016330 19.373 < 2e-16 ***
male 0.061390 0.016832 3.647 0.000271 ***
popdens 0.329284 0.038020 8.661 < 2e-16 ***
manufact -0.075423 0.017932 -4.206 2.70e-05 ***
tourism 0.058192 0.018085 3.218 0.001311 **
academics 0.161068 0.029716 5.420 6.61e-08 ***
medinc 0.129013 0.025241 5.111 3.48e-07 ***
physician_pc 0.001339 0.016398 0.082 0.934927
onset_prev -0.005433 0.002330 -2.332 0.019797 *
slope_prev 0.151238 0.019733 7.664 2.69e-14 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.6911 on 2178 degrees of freedom
(184 observations deleted due to missingness)
Multiple R-squared: 0.498, Adjusted R-squared: 0.4941
F-statistic: 127.1 on 17 and 2178 DF, p-value: < 2.2e-16
lm_meandiff_socdist_ctrl %>% confint(level=0.9)
5 % 95 %
(Intercept) 0.125642215 0.643489450
pers_o 0.017998062 0.083276387
pers_c -0.072737018 -0.004264821
pers_e 0.002417378 0.059515385
pers_a -0.104134763 -0.030964564
pers_n 0.158939161 0.228579562
airport_distance -0.081095530 -0.025330047
republican -0.237085304 -0.176644976
medage 0.289485938 0.343228106
male 0.033691376 0.089088738
popdens 0.266719876 0.391847728
manufact -0.104931822 -0.045915121
tourism 0.028432430 0.087951016
academics 0.112168212 0.209967646
medinc 0.087478364 0.170548176
physician_pc -0.025644312 0.028322289
onset_prev -0.009266471 -0.001599000
slope_prev 0.118766109 0.183708968
Linear models predicting mean differences
ctrls <- cforest_unbiased(ntree=500, mtry=5)
crf_meandiff_socdist <- cforest(mean_diff_socdist ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc,
data = df_us_cpt_socdist,
controls = ctrls)
crf_meandiff_socdist_varimp <- varimp(crf_meandiff_socdist, nperm = 1)
crf_meandiff_socdist_varimp_cond <- varimp(crf_meandiff_socdist, conditional = T, nperm = 1)
crf_meandiff_socdist_varimp
pers_o pers_c pers_e pers_a
0.023820991 0.025051356 0.001157161 0.057851204
pers_n airport_distance republican medage
0.031209835 0.011115324 0.147250970 0.177245361
male popdens manufact tourism
0.009491305 0.231710899 0.027431972 0.027842457
academics medinc physician_pc
0.072246678 0.066667134 0.001334095
crf_meandiff_socdist_varimp %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

crf_meandiff_socdist_varimp_cond
pers_o pers_c pers_e pers_a
0.025376206 0.027343070 0.001738617 0.062022318
pers_n airport_distance republican medage
0.033256945 0.010758335 0.154836773 0.182728962
male popdens manufact tourism
0.009199907 0.238997444 0.034532457 0.030523903
academics medinc physician_pc
0.078720326 0.065719158 0.002819058
crf_meandiff_socdist_varimp_cond %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

CRF predicting mean difference
# predict hazard from personality
cox_cpt_socdist_2 <- coxph(Surv(cpt_day_socdist_2, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_us_cpt_socdist)
cox_cpt_socdist_2 %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist_2, event) ~ pers_o + pers_c +
pers_e + pers_a + pers_n, data = df_us_cpt_socdist)
n= 2380, number of events= 2379
coef exp(coef) se(coef) z Pr(>|z|)
pers_o -0.14730 0.86303 0.02283 -6.453 1.10e-10 ***
pers_c -0.11744 0.88919 0.02688 -4.369 1.25e-05 ***
pers_e 0.03018 1.03064 0.02355 1.282 0.19998
pers_a 0.03223 1.03276 0.02720 1.185 0.23607
pers_n 0.07865 1.08183 0.02638 2.982 0.00287 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 0.8630 1.1587 0.8253 0.9025
pers_c 0.8892 1.1246 0.8436 0.9373
pers_e 1.0306 0.9703 0.9841 1.0793
pers_a 1.0328 0.9683 0.9791 1.0893
pers_n 1.0818 0.9244 1.0273 1.1392
Concordance= 0.598 (se = 0.008 )
Likelihood ratio test= 109.1 on 5 df, p=<2e-16
Wald test = 112.2 on 5 df, p=<2e-16
Score (logrank) test = 111.5 on 5 df, p=<2e-16
# predict hazard from personality with controls
cox_cpt_socdist_ctrl_2 <- coxph(Surv(cpt_day_socdist_2, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc +
onset_prev + slope_prev ,
data = df_us_cpt_socdist)
cox_cpt_socdist_ctrl_2 %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist_2, event) ~ pers_o + pers_c +
pers_e + pers_a + pers_n + airport_distance + republican +
medage + male + popdens + manufact + tourism + academics +
medinc + physician_pc + onset_prev + slope_prev, data = df_us_cpt_socdist)
n= 2196, number of events= 2195
(184 observations deleted due to missingness)
coef exp(coef) se(coef) z Pr(>|z|)
pers_o -0.0977782 0.9068500 0.0295918 -3.304 0.000952 ***
pers_c -0.1102061 0.8956495 0.0290631 -3.792 0.000149 ***
pers_e 0.0423876 1.0432987 0.0258637 1.639 0.101238
pers_a 0.0196323 1.0198262 0.0307933 0.638 0.523766
pers_n 0.0577244 1.0594230 0.0312407 1.848 0.064641 .
airport_distance -0.0204996 0.9797090 0.0257576 -0.796 0.426109
republican -0.0204758 0.9797324 0.0268872 -0.762 0.446332
medage 0.0001654 1.0001654 0.0227102 0.007 0.994188
male -0.0216697 0.9785634 0.0235641 -0.920 0.357780
popdens -0.1960015 0.8220110 0.0638107 -3.072 0.002129 **
manufact 0.1517729 1.1638959 0.0251996 6.023 1.71e-09 ***
tourism -0.0607958 0.9410154 0.0263591 -2.306 0.021086 *
academics 0.1096653 1.1159045 0.0410448 2.672 0.007544 **
medinc 0.0207527 1.0209695 0.0343697 0.604 0.545972
physician_pc -0.0434169 0.9575121 0.0247516 -1.754 0.079413 .
onset_prev -0.0054441 0.9945707 0.0034311 -1.587 0.112583
slope_prev -0.2044823 0.8150692 0.0287518 -7.112 1.14e-12 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 0.9068 1.1027 0.8557 0.9610
pers_c 0.8956 1.1165 0.8461 0.9481
pers_e 1.0433 0.9585 0.9917 1.0975
pers_a 1.0198 0.9806 0.9601 1.0833
pers_n 1.0594 0.9439 0.9965 1.1263
airport_distance 0.9797 1.0207 0.9315 1.0304
republican 0.9797 1.0207 0.9294 1.0327
medage 1.0002 0.9998 0.9566 1.0457
male 0.9786 1.0219 0.9344 1.0248
popdens 0.8220 1.2165 0.7254 0.9315
manufact 1.1639 0.8592 1.1078 1.2228
tourism 0.9410 1.0627 0.8936 0.9909
academics 1.1159 0.8961 1.0297 1.2094
medinc 1.0210 0.9795 0.9545 1.0921
physician_pc 0.9575 1.0444 0.9122 1.0051
onset_prev 0.9946 1.0055 0.9879 1.0013
slope_prev 0.8151 1.2269 0.7704 0.8623
Concordance= 0.637 (se = 0.008 )
Likelihood ratio test= 232.8 on 17 df, p=<2e-16
Wald test = 227.3 on 17 df, p=<2e-16
Score (logrank) test = 230.4 on 17 df, p=<2e-16
Predicting change points with time-to-event regression
lm_meandiff_socdist_2 <- lm(mean_diff_socdist_2 ~
pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_us_cpt_socdist)
lm_meandiff_socdist_2 %>% summary()
Call:
lm(formula = mean_diff_socdist_2 ~ pers_o + pers_c + pers_e +
pers_a + pers_n, data = df_us_cpt_socdist)
Residuals:
Min 1Q Median 3Q Max
-9.2029 -0.4306 0.0314 0.4752 3.5934
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -5.361e-16 1.890e-02 0.000 1.00000
pers_o 3.433e-01 2.049e-02 16.753 < 2e-16 ***
pers_c -1.273e-01 2.564e-02 -4.962 7.46e-07 ***
pers_e 8.647e-02 2.108e-02 4.101 4.25e-05 ***
pers_a -1.013e-02 2.618e-02 -0.387 0.69876
pers_n -6.321e-02 2.392e-02 -2.643 0.00828 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.9221 on 2374 degrees of freedom
Multiple R-squared: 0.1515, Adjusted R-squared: 0.1497
F-statistic: 84.79 on 5 and 2374 DF, p-value: < 2.2e-16
lm_meandiff_socdist_2 %>% confint(level=0.9)
5 % 95 %
(Intercept) -0.03110172 0.03110172
pers_o 0.30962103 0.37706929
pers_c -0.16944669 -0.08505576
pers_e 0.05177379 0.12115788
pers_a -0.05320705 0.03294326
pers_n -0.10256368 -0.02384996
lm_meandiff_socdist_ctrl_2 <- lm(mean_diff_socdist_2 ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc +
onset_prev + slope_prev ,
data = df_us_cpt_socdist)
lm_meandiff_socdist_ctrl_2 %>% summary()
Call:
lm(formula = mean_diff_socdist_2 ~ pers_o + pers_c + pers_e +
pers_a + pers_n + airport_distance + republican + medage +
male + popdens + manufact + tourism + academics + medinc +
physician_pc + onset_prev + slope_prev, data = df_us_cpt_socdist)
Residuals:
Min 1Q Median 3Q Max
-8.5540 -0.2750 0.0349 0.3743 2.4846
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.797330 0.172285 4.628 3.91e-06 ***
pers_o 0.098013 0.021718 4.513 6.73e-06 ***
pers_c -0.065237 0.022780 -2.864 0.00423 **
pers_e 0.028005 0.018996 1.474 0.14056
pers_a 0.039602 0.024343 1.627 0.10392
pers_n 0.094196 0.023169 4.066 4.96e-05 ***
airport_distance -0.080890 0.018553 -4.360 1.36e-05 ***
republican -0.162802 0.020108 -8.096 9.32e-16 ***
medage 0.101116 0.017880 5.655 1.76e-08 ***
male 0.018963 0.018430 1.029 0.30365
popdens 0.216815 0.041629 5.208 2.09e-07 ***
manufact -0.053730 0.019635 -2.736 0.00626 **
tourism 0.054977 0.019801 2.776 0.00554 **
academics 0.010810 0.032537 0.332 0.73975
medinc 0.262251 0.027637 9.489 < 2e-16 ***
physician_pc -0.018855 0.017954 -1.050 0.29375
onset_prev -0.011561 0.002551 -4.532 6.16e-06 ***
slope_prev 0.175028 0.021606 8.101 8.99e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.7567 on 2178 degrees of freedom
(184 observations deleted due to missingness)
Multiple R-squared: 0.4256, Adjusted R-squared: 0.4212
F-statistic: 94.94 on 17 and 2178 DF, p-value: < 2.2e-16
lm_meandiff_socdist_ctrl_2 %>% confint(level=0.9)
5 % 95 %
(Intercept) 0.5138262725 1.080833598
pers_o 0.0622754890 0.133750793
pers_c -0.1027232215 -0.027750846
pers_e -0.0032540685 0.059264346
pers_a -0.0004560502 0.079660316
pers_n 0.0560700586 0.132321538
airport_distance -0.1114197918 -0.050360399
republican -0.1958908439 -0.129712816
medage 0.0716937998 0.130537801
male -0.0113653754 0.049290949
popdens 0.1483115400 0.285317985
manufact -0.0860393375 -0.021420084
tourism 0.0223922310 0.087561014
academics -0.0427319068 0.064351788
medinc 0.2167730070 0.307728772
physician_pc -0.0484002307 0.010689509
onset_prev -0.0157587671 -0.007363411
slope_prev 0.1394735086 0.210581500
Linear models predicting mean differences
ctrls <- cforest_unbiased(ntree=500, mtry=5)
crf_meandiff_socdist_2 <- cforest(mean_diff_socdist_2 ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc,
data = df_us_cpt_socdist,
controls = ctrls)
crf_meandiff_socdist_varimp <- varimp(crf_meandiff_socdist_2, nperm = 1)
crf_meandiff_socdist_varimp_cond <- varimp(crf_meandiff_socdist_2, conditional = T, nperm = 1)
crf_meandiff_socdist_varimp
pers_o pers_c pers_e pers_a
0.037116142 0.011131620 0.001751406 0.015402157
pers_n airport_distance republican medage
0.003470990 0.014201374 0.114029674 0.015711834
male popdens manufact tourism
0.005168556 0.215045051 0.018685589 0.011515721
academics medinc physician_pc
0.058227126 0.100319631 0.002844632
crf_meandiff_socdist_varimp %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

crf_meandiff_socdist_varimp_cond
pers_o pers_c pers_e pers_a
0.042193802 0.013462952 0.001172980 0.016247157
pers_n airport_distance republican medage
0.004249825 0.015276098 0.116648436 0.015332295
male popdens manufact tourism
0.005754267 0.220635909 0.019523230 0.014738936
academics medinc physician_pc
0.074979132 0.107775691 0.003803785
crf_meandiff_socdist_varimp_cond %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

CRF predicting mean difference
us_list_results <- list(cox_onset_prev, cox_onset_prev_ctrl,
lm_slope_prev, lm_slope_prev_ctrl,
cox_cpt_socdist, cox_cpt_socdist_ctrl,
lm_meandiff_socdist, lm_meandiff_socdist_ctrl,
cox_cpt_socdist_2, cox_cpt_socdist_ctrl_2,
lm_meandiff_socdist_2, lm_meandiff_socdist_ctrl_2)
results_names <- list('cox_onset_prev', 'cox_onset_prev_ctrl',
'lm_slope_prev', 'lm_slope_prev_ctrl',
'cox_cpt_socdist', 'cox_cpt_socdist_ctrl',
'lm_meandiff_socdist', 'lm_meandiff_socdist_ctrl',
'cox_cpt_socdist_2', 'cox_cpt_socdist_ctrl_2',
'lm_meandiff_socdist_2', 'lm_meandiff_socdist_ctrl_2')
names(us_list_results) <- results_names
save(us_list_results, file="us_list_results.RData")
Export data
us_list_results <- list(cox_onset_prev, cox_onset_prev_ctrl,
lm_slope_prev, lm_slope_prev_ctrl,
cox_cpt_socdist, cox_cpt_socdist_ctrl,
lm_meandiff_socdist, lm_meandiff_socdist_ctrl,
cox_cpt_socdist_2, cox_cpt_socdist_ctrl_2,
lm_meandiff_socdist_2, lm_meandiff_socdist_ctrl_2)
results_names <- list('cox_onset_prev', 'cox_onset_prev_ctrl',
'lm_slope_prev', 'lm_slope_prev_ctrl',
'cox_cpt_socdist', 'cox_cpt_socdist_ctrl',
'lm_meandiff_socdist', 'lm_meandiff_socdist_ctrl',
'cox_cpt_socdist_2', 'cox_cpt_socdist_ctrl_2',
'lm_meandiff_socdist_2', 'lm_meandiff_socdist_ctrl_2')
names(us_list_results) <- results_names
save(us_list_results, file="us_list_results.RData")
write_csv(df_us_slope_prev, '/Users/hp2500/Google Drive/STUDY/Columbia/Research/Corona/Delivery/df_us_slope_prev.csv')
write_csv(df_us_cpt_socdist, '/Users/hp2500/Google Drive/STUDY/Columbia/Research/Corona/Delivery/df_us_cpt_socdist.csv')
LS0tCnRpdGxlOiAiQ09WSUQtMTkgVVMiCmF1dGhvcjogIkhlaW5yaWNoIFBldGVycyIKZGF0ZTogIjQvMTUvMjAyMCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCiMgTUFDCiBrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICcvVXNlcnMvaHAyNTAwL0dvb2dsZSBEcml2ZS9TVFVEWS9Db2x1bWJpYS9SZXNlYXJjaC9Db3JvbmEvRGF0YS9VUycpCgpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGFydHkpCmxpYnJhcnkoZG9QYXJhbGxlbCkKbGlicmFyeShjaGFuZ2Vwb2ludCkKbGlicmFyeShzdXJ2aXZhbCkKbGlicmFyeShzdXJ2bWluZXIpCmxpYnJhcnkoY2Vuc1JlZykKCmBgYAoKCiMgUHJlcGFyZSBjb3VudHkgbGV2ZWwgZGF0YSAKCiMjIyBSZWFkIGFuZCBmb3JtYXQgcGVyc29uYWxpdHkgZGF0YSAKYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CgpkZl91c19wZXJzIDwtIHJlYWRfY3N2KCd0aW1lc2VyaWVzX3VzYV9jb3VudHlfbWFyY2gxX2FwcmlsXzA5LmNzdicpCgpkZl91c19wZXJzIDwtIGRmX3VzX3BlcnMgJT4lIHNlbGVjdChjb3VudHlmaXBzLCBvcGVuLCBzY2ksIGV4dHJhLCBhZ3JlZSwgc3RhYmlsKSAlPiUgCiAgbXV0YXRlKHN0YWJpbCA9IDYtc3RhYmlsKSAlPiUKICBkcGx5cjo6cmVuYW1lKGNvdW50eV9maXBzID0gY291bnR5ZmlwcywKICAgICAgICAgcGVyc19vID0gb3BlbiwgCiAgICAgICAgIHBlcnNfYyA9IHNjaSwKICAgICAgICAgcGVyc19lID0gZXh0cmEsCiAgICAgICAgIHBlcnNfYSA9IGFncmVlLAogICAgICAgICBwZXJzX24gPSBzdGFiaWwpICU+JSAKICBkaXN0aW5jdCgpICU+JQogIG11dGF0ZShjb3VudHlfZmlwcyA9IGFzLmNoYXJhY3Rlcihjb3VudHlfZmlwcykpCgpgYGAKCiMjIyBSZWFkIGFuZCBmb3JtYXQgcHJldmFsZW5jZSBkYXRhIApgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KCmRmX3VzX3ByZXYgPC0gcmVhZF9jc3YoJ1VTQV90aW1lc2VyaWVzX3ByZXBfMjAwNS5jc3YnKQoKZGZfdXNfcHJldiA8LSBkZl91c19wcmV2ICU+JSAKICBzZWxlY3QoZmlwcywgZGF0ZSwgcmF0ZSkgJT4lIAogIG11dGF0ZShkYXRlID0gYXMuRGF0ZShkYXRlLCAiJWQlYiVZIikpICU+JSAKICByZW5hbWUoY291bnR5X2ZpcHMgPSBmaXBzLCAKICAgICAgICAgcmF0ZV9kYXkgPSByYXRlKSAlPiUKICBtdXRhdGUoY291bnR5X2ZpcHMgPSBhcy5jaGFyYWN0ZXIoY291bnR5X2ZpcHMpKQoKZGZfdXNfcHJldiAlPiUgd3JpdGVfY3N2KCd1c19wcmV2X2ZpcHMuY3N2JykKYGBgCgojIyMgUmVhZCBhbmQgZm9ybWF0IGNvdW50eSBsZXZlbCBjb250cm9scyAKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmRmX3VzX2N0cmwgPC0gcmVhZC5jc3YoJ2NvbnRyb2xzX1VTLmNzdicpCgpkZl91c19jdHJsIDwtIGRmX3VzX2N0cmwgJT4lIHNlbGVjdCgtY291bnR5X25hbWUpICU+JSAKICByZW5hbWUoY291bnR5X2ZpcHMgPSBjb3VudHkpICU+JQogIG11dGF0ZShjb3VudHlfZmlwcyA9IGFzLmNoYXJhY3Rlcihjb3VudHlfZmlwcykpCgpkZl91c19jdHJsCmBgYAoKIyMjIFJlYWQgYW5kIGZvcm1hdCBzb2NpYWwgZGlzdGFuY2luZyBkYXRhIEZCCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQoKZmJfZmlsZXMgPC0gbGlzdC5maWxlcygnLi4vRkIgRGF0YS9VUyBpbmRpdmlkdWFsIGZpbGVzL01vYmlsaXR5LycsCiAgICAgICAgICAgICAgICAgICAgICAgJyouY3N2JywgZnVsbC5uYW1lcyA9IFQpCgpkZl91c19zb2NkaXN0IDwtIGZiX2ZpbGVzICU+JSAKICBtYXAocmVhZF9jc3YpICU+JSBiaW5kX3Jvd3MoKQoKZGZfdXNfc29jZGlzdCA8LSBkZl91c19zb2NkaXN0ICU+JQogIHNlbGVjdCgtYWdlX2JyYWNrZXQsIC1nZW5kZXIsIC1iYXNlbGluZV9uYW1lLCAtYmFzZWxpbmVfdHlwZSwgLXBvbHlnb25fbmFtZSkgJT4lCiAgcmVuYW1lKGRhdGUgPSBkcywKICAgICAgICAgY291bnR5X2ZpcHMgPSBwb2x5Z29uX2lkLAogICAgICAgICBzb2NkaXN0X3RpbGVzID0gYWxsX2RheV9iaW5nX3RpbGVzX3Zpc2l0ZWRfcmVsYXRpdmVfY2hhbmdlLAogICAgICAgICBzb2NkaXN0X3NpbmdsZV90aWxlID0gYWxsX2RheV9yYXRpb19zaW5nbGVfdGlsZV91c2VycykgJT4lCiAgbXV0YXRlKGNvdW50eV9maXBzID0gYXMuY2hhcmFjdGVyKGNvdW50eV9maXBzKSkKCmRmX3VzX3NvY2Rpc3QKYGBgCgpgYGB7cn0KZGZfdXNfc29jZGlzdCAlPiUgc2VsZWN0KGNvdW50eV9maXBzKSAlPiUgZGlzdGluY3QoKSAlPiUgbnJvdygpCmBgYAoKCiMjIyBNZXJnZSBkYXRhCmBgYHtyfQoKIyBjcmVhdGUgc2VxdWVuY2Ugb2YgZGF0ZXMKZGF0ZV9zZXF1ZW5jZSA8LSBzZXEuRGF0ZShtaW4oZGZfdXNfcHJldiRkYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoZGZfdXNfcHJldiRkYXRlKSwgMSkKICAgICAgICAgICAgICAgICAgICAgCiMgY3JlYXRlIGRhdGEgZnJhbWUgd2l0aCB0aW1lIHNlcXVlbmNlCmRmX2RhdGVzID0gZGF0YS5mcmFtZShkYXRlX3NlcXVlbmNlLCAxOmxlbmd0aChkYXRlX3NlcXVlbmNlKSkgCm5hbWVzKGRmX2RhdGVzKSA8LSBjKCdkYXRlJywgJ3RpbWUnKQoKIyBqb2luIGRhdGEgZnJhbWVzIApkZl91c19wcmV2IDwtIGRmX3VzX3ByZXYgJT4lCiAgcGx5cjo6am9pbihkZl91c19jdHJsLCBieT0nY291bnR5X2ZpcHMnKSAlPiUgCiAgcGx5cjo6am9pbihkZl91c19wZXJzLCBieT0nY291bnR5X2ZpcHMnKSAlPiUKICBtZXJnZShkZl9kYXRlcywgYnk9J2RhdGUnKSAlPiUgCiAgYXJyYW5nZShjb3VudHlfZmlwcywgZGF0ZSkKCmRmX3VzX3ByZXYgJT4lIHNlbGVjdCgtZGF0ZSwgLXJhdGVfZGF5LCAtdGltZSkgJT4lIGRpc3RpbmN0KCkgJT4lIHdyaXRlX2NzdignZGZfdXNfcGVyc19maXBzLmNzdicpCmBgYAoKCmBgYHtyfQoKIyBjcmVhdGUgc2VxdWVuY2Ugb2YgZGF0ZXMKZGF0ZV9zZXF1ZW5jZSA8LSBzZXEuRGF0ZShtaW4oZGZfdXNfc29jZGlzdCRkYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5EYXRlKCcyMDIwLTA0LTI4JyksIDEpCiAgICAgICAgICAgICAgICAgICAgIAojIGNyZWF0ZSBkYXRhIGZyYW1lIHdpdGggdGltZSBzZXF1ZW5jZQpkZl9kYXRlcyA9IGRhdGEuZnJhbWUoZGF0ZV9zZXF1ZW5jZSwgMTpsZW5ndGgoZGF0ZV9zZXF1ZW5jZSkpIApuYW1lcyhkZl9kYXRlcykgPC0gYygnZGF0ZScsICd0aW1lJykKCiMgam9pbiBkYXRhIGZyYW1lcyAKZGZfdXNfc29jZGlzdCA8LSBkZl91c19zb2NkaXN0ICU+JQogIHBseXI6OmpvaW4oZGZfdXNfY3RybCwgYnk9J2NvdW50eV9maXBzJykgJT4lIAogIHBseXI6OmpvaW4oZGZfdXNfcGVycywgYnk9J2NvdW50eV9maXBzJykgJT4lCiAgaW5uZXJfam9pbihkZl9kYXRlcywgYnk9J2RhdGUnKSAlPiUgCiAgYXJyYW5nZShjb3VudHlfZmlwcywgZGF0ZSkKCmZpcHNfY29tcGxldGUgPC0gZGZfdXNfc29jZGlzdCAlPiUgCiAgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JSAKICBzdW1tYXJpemUobiA9IG4oKSkgJT4lIAogIGZpbHRlcighIG48bWF4KG4pKSAlPiUgLiRjb3VudHlfZmlwcwoKZGZfdXNfc29jZGlzdCA8LSBkZl91c19zb2NkaXN0ICU+JQogIGZpbHRlcihjb3VudHlfZmlwcyAlaW4lIGZpcHNfY29tcGxldGUpCgpkZl91c19zb2NkaXN0CmBgYAoKCgojIyMgQ29udHJvbCBmb3Igd2Vla2VuZCBlZmZlY3QgCmBgYHtyfQoKZWFzdGVyIDwtIHNlcS5EYXRlKGFzLkRhdGUoJzIwMjAtMDQtMTAnKSwgYXMuRGF0ZSgnMjAyMC0wNC0xMycpLCAxKQoKZGZfdXNfbG9lc3MgPC0gZGZfdXNfc29jZGlzdCAlPiUgCiAgbXV0YXRlKHdlZWtkYXkgPSBmb3JtYXQoZGF0ZSwgJyV1JykpICU+JSAKICBmaWx0ZXIoIXdlZWtkYXkgJWluJSBjKCc2JywnNycpIHwgZGF0ZSAlaW4lIGVhc3RlcikgJT4lIAogIHNwbGl0KC4kY291bnR5X2ZpcHMpICU+JQogIG1hcCh+IGxvZXNzKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgfiB0aW1lLCBkYXRhID0gLikpICU+JQogIG1hcChwcmVkaWN0LCAxOm1heChkZl91c19zb2NkaXN0JHRpbWUpKSAlPiUgCiAgYmluZF9yb3dzKCkgJT4lIAogIGdhdGhlcihrZXkgPSAnY291bnR5X2ZpcHMnLCB2YWx1ZSA9ICdsb2VzcycpICU+JSAKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lIAogIG11dGF0ZSh0aW1lID0gcm93X251bWJlcigpKQoKZGZfdXNfbG9lc3NfMiA8LSBkZl91c19zb2NkaXN0ICU+JSAKICBtdXRhdGUod2Vla2RheSA9IGZvcm1hdChkYXRlLCAnJXUnKSkgJT4lIAogIGZpbHRlcighd2Vla2RheSAlaW4lIGMoJzYnLCc3JykgfCBkYXRlICVpbiUgZWFzdGVyKSAlPiUgCiAgc3BsaXQoLiRjb3VudHlfZmlwcykgJT4lCiAgbWFwKH4gbG9lc3Moc29jZGlzdF90aWxlcyB+IHRpbWUsIGRhdGEgPSAuKSkgJT4lCiAgbWFwKHByZWRpY3QsIDE6bWF4KGRmX3VzX3NvY2Rpc3QkdGltZSkpICU+JSAKICBiaW5kX3Jvd3MoKSAlPiUgCiAgZ2F0aGVyKGtleSA9ICdjb3VudHlfZmlwcycsIHZhbHVlID0gJ2xvZXNzJykgJT4lIAogIHJlbmFtZShsb2Vzc18yID0gbG9lc3MpICU+JQogIGdyb3VwX2J5KGNvdW50eV9maXBzKSAlPiUgCiAgbXV0YXRlKHRpbWUgPSByb3dfbnVtYmVyKCkpCgpkZl91c19zb2NkaXN0IDwtIGRmX3VzX3NvY2Rpc3QgJT4lIAogIG1lcmdlKGRmX3VzX2xvZXNzLCBieT1jKCdjb3VudHlfZmlwcycsICd0aW1lJykpICU+JSAKICBtZXJnZShkZl91c19sb2Vzc18yLCBieT1jKCdjb3VudHlfZmlwcycsICd0aW1lJykpICU+JSAKICBtdXRhdGUod2Vla2RheSA9IGZvcm1hdChkYXRlLCAnJXUnKSkgJT4lIAogIG11dGF0ZShzb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuID0gaWZlbHNlKHdlZWtkYXkgJWluJSBjKCc2JywnNycpIHwgZGF0ZSAlaW4lIGVhc3RlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9lc3MsIHNvY2Rpc3Rfc2luZ2xlX3RpbGUpLAogICAgICAgICBzb2NkaXN0X3RpbGVzX2NsZWFuID0gaWZlbHNlKHdlZWtkYXkgJWluJSBjKCc2JywnNycpIHwgZGF0ZSAlaW4lIGVhc3RlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9lc3NfMiwgc29jZGlzdF90aWxlcykpICU+JQogIGFycmFuZ2UoY291bnR5X2ZpcHMsIHRpbWUpICU+JSAKICBzZWxlY3QoLXdlZWtkYXkpCgpkZl91c19zb2NkaXN0IDwtIGRmX3VzX3NvY2Rpc3QgJT4lIGRyb3BfbmEoKSAlPiUgbXV0YXRlKHRpbWUgPSB0aW1lLTEpCmBgYAoKCiMjIyBQbG90IHByZXZhbGVuY2Ugb3ZlciB0aW1lCmBgYHtyfQoKZGZfdXNfcHJldiAlPiUgc2FtcGxlX24oMjAwMDApICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXJhdGVfZGF5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9Y291bnR5X2ZpcHMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoIk92ZXJhbGwgcHJldmFsZW5jZSBvdmVyIHRpbWUiKQoKcGVycyA8LSBjKCdwZXJzX28nLCAncGVyc19jJywgJ3BlcnNfZScsICdwZXJzX2EnLCAncGVyc19uJykKCmZvciAoaSBpbiBwZXJzKXsKCmdnIDwtIGRmX3VzX3ByZXYgJT4lIAogIG11dGF0ZShwcmV2X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLUluZiwgcXVhbnRpbGUoLltbaV1dLCAwLjA1LCBuYS5ybT1UKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWxlKC5bW2ldXSwgMC45NSwgbmEucm09VCksIEluZiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdsb3dlciB0YWlsJywgJ2NlbnRlcicsICd1cHBlciB0YWlsJykpKSAlPiUgCiAgZmlsdGVyKHByZXZfdGFpbCAhPSAnY2VudGVyJykgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9cmF0ZV9kYXkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1jb3VudHlfZmlwcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICBmYWNldF93cmFwKH5wcmV2X3RhaWwpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKyAKICBnZ3RpdGxlKGkpCgpwcmludChnZykKfQpgYGAKCgojIyMgUGxvdCBzb2NpYWwgZGlzdGFuY2luZyBzaW5nbGUgdGlsZSB2aXNpdGVkCmBgYHtyfQoKZGZfdXNfc29jZGlzdCAlPiUgc2FtcGxlX24oMTAwMDApICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4pKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1jb3VudHlfZmlwcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBzb2NpYWwgZGlzdGFuY2luZyAoc2luZ2xlIHRpbGUpIG92ZXIgdGltZSIpCgpwZXJzIDwtIGMoJ3BlcnNfbycsICdwZXJzX2MnLCAncGVyc19lJywgJ3BlcnNfYScsICdwZXJzX24nKQoKZm9yIChpIGluIHBlcnMpewoKZ2cgPC0gZGZfdXNfc29jZGlzdCAlPiUgCiAgbXV0YXRlKGRpc3RfdGFpbCA9IGN1dCguW1tpXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMDUsIG5hLnJtID0gVCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGlsZSguW1tpXV0sIDAuOTUsIG5hLnJtID0gVCksIEluZiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdsb3dlciB0YWlsJywgJ2NlbnRlcicsICd1cHBlciB0YWlsJykpKSAlPiUgCiAgZmlsdGVyKGRpc3RfdGFpbCAhPSAnY2VudGVyJykgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9c29jZGlzdF9zaW5nbGVfdGlsZV9jbGVhbikpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWNvdW50eV9maXBzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIGZhY2V0X3dyYXAofmRpc3RfdGFpbCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZShpKQoKcHJpbnQoZ2cpCn0KYGBgCgoKYGBge3J9CgpkZl91c19zb2NkaXN0ICU+JSBzYW1wbGVfbigxMDAwMCkgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9c29jZGlzdF90aWxlc19jbGVhbikpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWNvdW50eV9maXBzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJPdmVyYWxsIHNvY2lhbCBkaXN0YW5jaW5nIChzaW5nbGUgdGlsZSkgb3ZlciB0aW1lIikKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl91c19zb2NkaXN0ICU+JSAKICBtdXRhdGUoZGlzdF90YWlsID0gY3V0KC5bW2ldXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC1JbmYsIHF1YW50aWxlKC5bW2ldXSwgMC4wNSwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWxlKC5bW2ldXSwgMC45NSwgbmEucm0gPSBUKSwgSW5mKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIoZGlzdF90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3RpbGVzX2NsZWFuKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9Y291bnR5X2ZpcHMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgZmFjZXRfd3JhcCh+ZGlzdF90YWlsKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKGkpCgpwcmludChnZykKfQoKYGBgCgoKIyMjIEV4YW1wbGUgcGxvdHMKYGBge3J9CgpkZl91c19wcmV2ICU+JSBmaWx0ZXIoY291bnR5X2ZpcHMgPT0gMTcwMzEgfAogICAgICAgICAgICAgICAgICAgICAgICBjb3VudHlfZmlwcyA9PSA0ODMxMykgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9cmF0ZV9kYXkpKSArIAogIGdlb21fbGluZShhZXMoY29sPWNvdW50eV9maXBzKSkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249J3JpZ2h0JykgKwogIGdndGl0bGUoIlBsYWNlaG9sZGVyIC0gUHJldmFsZW5jZSBPdmVyIFRpbWUiKQoKYGBgCgpgYGB7cn0KCmRmX3VzX3NvY2Rpc3QgJT4lIGZpbHRlcihjb3VudHlfZmlwcyA9PSAyMTIyNSB8CiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50eV9maXBzID09IDQ4NDE5KSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3RpbGVzX2NsZWFuKSkgKyAKICBnZW9tX2xpbmUoYWVzKGNvbD1jb3VudHlfZmlwcykpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSdyaWdodCcpICsKICBnZ3RpdGxlKCJQbGFjZWhvbGRlciAtIFByZXZhbGVuY2UgVGlsZXMgVmlzaXRlZCBPdmVyIFRpbWUiKQoKYGBgCgoKYGBge3J9CgpkZl91c19zb2NkaXN0ICU+JSBmaWx0ZXIoY291bnR5X2ZpcHMgPT0gMzAwMzUgfAogICAgICAgICAgICAgICAgICAgICAgICBjb3VudHlfZmlwcyA9PSAyMDE3NSkgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9c29jZGlzdF9zaW5nbGVfdGlsZV9jbGVhbikpICsgCiAgZ2VvbV9saW5lKGFlcyhjb2w9Y291bnR5X2ZpcHMpKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ncmlnaHQnKSArCiAgZ2d0aXRsZSgiUGxhY2Vob2xkZXIgLSBQcmV2YWxlbmNlIFRpbGVzIFZpc2l0ZWQgT3ZlciBUaW1lIikKCmBgYAoKCmBgYHtyfQoKZGZfdXNfc29jZGlzdCA8LSBkZl91c19zb2NkaXN0ICU+JSAKICBtdXRhdGUoc29jZGlzdF9zaW5nbGVfdGlsZSA9IHNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4sCiAgICAgICAgIHNvY2Rpc3RfdGlsZXMgPSBzb2NkaXN0X3RpbGVzX2NsZWFuKSAlPiUgCiAgc2VsZWN0KC1sb2VzcywgLWxvZXNzXzIsIC1zb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuLCAtc29jZGlzdF90aWxlc19jbGVhbikKYGBgCgojIyMgQ29ycmVsYXRpb25zIApgYGB7cn0KCmRmX3VzX3ByZXYgJT4lIHNlbGVjdCgtdGltZSwgLWRhdGUpICU+JSAKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lCiAgc3VtbWFyaXplX2lmKGlzLm51bWVyaWMsIG1lYW4pICU+JSAKICBzZWxlY3QoLWNvdW50eV9maXBzKSAlPiUKICBjb3IodXNlPSdwYWlyd2lzZS5jb21wbGV0ZS5vYnMnKSAlPiUgCiAgcm91bmQoMykgJT4lIGFzLmRhdGEuZnJhbWUoKQoKZGZfdXNfc29jZGlzdCAlPiUgc2VsZWN0KC10aW1lLCAtZGF0ZSkgJT4lIAogIGdyb3VwX2J5KGNvdW50eV9maXBzKSAlPiUKICBzdW1tYXJpemVfaWYoaXMubnVtZXJpYywgbWVhbikgJT4lIAogIHNlbGVjdCgtY291bnR5X2ZpcHMpICU+JQogIGNvcih1c2U9J3BhaXJ3aXNlLmNvbXBsZXRlLm9icycpICU+JSAKICByb3VuZCgzKSAlPiUgYXMuZGF0YS5mcmFtZSgpCiAgCmBgYAoKIyMjIFJlc2NhbGUgRGF0YQpgYGB7cn0KCmx2bDJfc2NhbGVkIDwtIGRmX3VzX3ByZXYgJT4lIAogIHNlbGVjdCgtdGltZSwgLWRhdGUsIC1yYXRlX2RheSkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKC1jb3VudHlfZmlwcyksIHNjYWxlKQoKbHZsMV9zY2FsZWQgPC0gZGZfdXNfcHJldiAlPiUgc2VsZWN0KGNvdW50eV9maXBzLCB0aW1lLCByYXRlX2RheSkKCmRmX3VzX3ByZXZfc2NhbGVkIDwtIHBseXI6OmpvaW4obHZsMV9zY2FsZWQsIGx2bDJfc2NhbGVkLCBieSA9ICdjb3VudHlfZmlwcycpIApgYGAKCmBgYHtyfQoKbHZsMl9zY2FsZWQgPC0gZGZfdXNfc29jZGlzdCAlPiUgCiAgc2VsZWN0KC10aW1lLCAtZGF0ZSwgLXNvY2Rpc3RfdGlsZXMsIC1zb2NkaXN0X3NpbmdsZV90aWxlKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoLWNvdW50eV9maXBzKSwgc2NhbGUpCgpsdmwxX3NjYWxlZCA8LSBkZl91c19zb2NkaXN0ICU+JSAKICBzZWxlY3QoY291bnR5X2ZpcHMsIHRpbWUsIHNvY2Rpc3Rfc2luZ2xlX3RpbGUsIHNvY2Rpc3RfdGlsZXMpCgpkZl91c19zb2NkaXN0X3NjYWxlZCA8LSBwbHlyOjpqb2luKGx2bDFfc2NhbGVkLCBsdmwyX3NjYWxlZCwgYnkgPSAnY291bnR5X2ZpcHMnKSAKYGBgCgojIFByZWRpY3QgUHJldmFsZW5jZQojIyMgRXh0cmFjdCBmaXJzdCBkYXkgb2YgY292aWQgb3V0YnJlYWsKYGBge3J9CgojIGdldCBvbnNldCBkYXkKZGZfdXNfb25zZXRfcHJldiA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUgCiAgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JSAKICBtdXRhdGUocmF0ZV9jcyA9IGN1bXN1bShyYXRlX2RheSkpICU+JSAKICBmaWx0ZXIocmF0ZV9jcyA+IDApICU+JQogIHN1bW1hcml6ZShvbnNldF9wcmV2ID0gbWluKHRpbWUpKSAlPiUKICBtdXRhdGUoY291bnR5X2ZpcHMgPSBhcy5jaGFyYWN0ZXIoY291bnR5X2ZpcHMpKQogIAojIG1lcmdlIHdpdGggY291bnR5IGRhdGEKZGZfdXNfb25zZXRfcHJldiA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUgCiAgc2VsZWN0KC10aW1lLCAtcmF0ZV9kYXkpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZShjb3VudHlfZmlwcyA9IGFzLmNoYXJhY3Rlcihjb3VudHlfZmlwcykpICU+JQogIGxlZnRfam9pbihkZl91c19vbnNldF9wcmV2LCBieSA9ICdjb3VudHlfZmlwcycpCgojIGhhbmRsZSBjZW5zb3JlZCBkYXRhCmRmX3VzX29uc2V0X3ByZXYgPC0gZGZfdXNfb25zZXRfcHJldiAlPiUgCiAgbXV0YXRlKGV2ZW50ID0gaWZlbHNlKGlzLm5hKG9uc2V0X3ByZXYpLCAwLCAxKSkgJT4lIAogIG11dGF0ZShvbnNldF9wcmV2ID0gcmVwbGFjZV9uYShvbnNldF9wcmV2LCBhcy5udW1lcmljKGRpZmYocmFuZ2UoZGZfdXNfcHJldiRkYXRlKSkpKzEpKQpgYGAKCiMjIyBFeHRyYWN0IHNsb3BlcwpgYGB7cn0KCiMgY3V0IHRpbWUgc2VyaWVzIGJlZm9yZSBvbnNldApkZl91c19wcmV2X3NjYWxlZCA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUgCiAgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JSAKICBtdXRhdGUocmF0ZV9jcyA9IGN1bXN1bShyYXRlX2RheSkpICU+JSAKICBmaWx0ZXIocmF0ZV9jcyA+IDApICU+JQogIG11dGF0ZSh0aW1lID0gdGltZS1taW4odGltZSkrMSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcih0aW1lIDw9IDMwKSAlPiUKICBzZWxlY3QoLXJhdGVfY3MpCgojIGRyb3AgY291bnRpZXMgd2l0aCBsaXR0bGUgZGF0YQpkZl91c19wcmV2X3NjYWxlZCA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lCiAgZmlsdGVyKG4oKSA9PSAzMCkgJT4lCiAgdW5ncm91cCgpCgojIGxvZyB0cmFuc2Zvcm0gcHJldmFsZW5jZSBkYXRhIApkZl91c19wcmV2X3NjYWxlZCA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUgCiAgbXV0YXRlKHJhdGVfZGF5ID0gbG9nKHJhdGVfZGF5KSkgJT4lCiAgZmlsdGVyKHJhdGVfZGF5ICE9IC1JbmYpCgojIGV4dHJhY3Qgc2xvcGUgcHJldmFsZW5jZQpkZl91c19zbG9wZV9wcmV2IDwtIGRmX3VzX3ByZXZfc2NhbGVkICU+JSBzcGxpdCguJGNvdW50eV9maXBzKSAlPiUgCiAgbWFwKH4gbG0ocmF0ZV9kYXkgfiB0aW1lLCBkYXRhID0gLikpICU+JQogIG1hcChjb2VmKSAlPiUgCiAgbWFwX2RibCgndGltZScpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbignY291bnR5X2ZpcHMnKSAlPiUgCiAgcmVuYW1lKHNsb3BlX3ByZXYgPSAnLicpCiAgCiMgbWVyZ2Ugd2l0aCBjb3VudHkgZGF0YQpkZl91c19zbG9wZV9wcmV2IDwtIGRmX3VzX29uc2V0X3ByZXYgJT4lIAogIGlubmVyX2pvaW4oZGZfdXNfc2xvcGVfcHJldiwgYnkgPSAnY291bnR5X2ZpcHMnKSAlPiUKICBkcm9wX25hKCkKCiMgaGFuZGxlIGNlbnNvcmVkIGRhdGEKZGZfdXNfc2xvcGVfcHJldl9jZW5zIDwtIGRmX3VzX3Nsb3BlX3ByZXYgJT4lIAogIGZpbHRlcihzbG9wZV9wcmV2Pj0wKSAlPiUgCiAgbXV0YXRlKHNsb3BlX3ByZXYgPSBzY2FsZShzbG9wZV9wcmV2KSwKICAgICAgICAgb25zZXRfcHJldiA9IHNjYWxlKG9uc2V0X3ByZXYpKQoKIyBzdGFuZGFyZGl6ZSBzbG9wZXMKZGZfdXNfc2xvcGVfcHJldiA8LSBkZl91c19zbG9wZV9wcmV2ICU+JSAKICBtdXRhdGUoc2xvcGVfcHJldiA9IHNjYWxlKHNsb3BlX3ByZXYpLAogICAgICAgICBvbnNldF9wcmV2ID0gc2NhbGUob25zZXRfcHJldikpCmBgYAoKIyMjIEV4cGxvcmUgZGlzdHJpYnV0aW9ucwpgYGB7cn0KCmRmX3VzX29uc2V0X3ByZXYgJT4lIGdncGxvdChhZXMob25zZXRfcHJldikpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkKZGZfdXNfc2xvcGVfcHJldiAlPiUgZ2dwbG90KGFlcyhzbG9wZV9wcmV2KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKQpkZl91c19zbG9wZV9wcmV2X2NlbnMgJT4lIGdncGxvdChhZXMoc2xvcGVfcHJldikpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkKCmBgYAoKIyMgUHJlZGljdCBDT1ZJRCBvbnNldCB3aXRoIHRpbWUtdG8tZXZlbnQgcmVncmVzc2lvbiAKYGBge3J9CgojIHByZWRpY3Qgb25zZXQgZnJvbSBwZXJzb25hbGl0eQpjb3hfb25zZXRfcHJldiA8LSBjb3hwaChTdXJ2KG9uc2V0X3ByZXYsIGV2ZW50KSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19vbnNldF9wcmV2KQpjb3hfb25zZXRfcHJldiAlPiUgc3VtbWFyeSgpCgojIHByZWRpY3Qgb25zZXQgZnJvbSBwZXJzb25hbGl0eSB3aXRoIGNvbnRyb2xzCmNveF9vbnNldF9wcmV2X2N0cmwgPC0gY294cGgoU3VydihvbnNldF9wcmV2LCBldmVudCkgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0X2Rpc3RhbmNlICsgcmVwdWJsaWNhbiArIG1lZGFnZSArIG1hbGUgKyBwb3BkZW5zICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0ICsgdG91cmlzbSArIGFjYWRlbWljcyArIG1lZGluYyArIHBoeXNpY2lhbl9wYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfb25zZXRfcHJldikKY294X29uc2V0X3ByZXZfY3RybCAlPiUgc3VtbWFyeSgpCgpgYGAKCiMjIFByZWRpY3QgcHJldmFsZW5jZSBzbG9wZXMgd2l0aCBsaW5lYXIgbW9kZWxzCmBgYHtyfQoKIyBwcmVkaWN0IHNsb3BlcyBmcm9tIHBlcnNvbmFsaXR5CmxtX3Nsb3BlX3ByZXYgPC0gbG0oc2xvcGVfcHJldiB+IHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfc2xvcGVfcHJldikKbG1fc2xvcGVfcHJldiAlPiUgc3VtbWFyeSgpCmxtX3Nsb3BlX3ByZXYgJT4lIGNvbmZpbnQobGV2ZWw9MC45KQoKCiMgcHJlZGljdCBzbG9wZXMgZnJvbSBwZXJzb25hbGl0eSB3aXRoIGNvbnRyb2xzCmxtX3Nsb3BlX3ByZXZfY3RybCA8LSBsbShzbG9wZV9wcmV2IH4gcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3QgKyB0b3VyaXNtICsgYWNhZGVtaWNzICsgbWVkaW5jICsgcGh5c2ljaWFuX3BjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgb25zZXRfcHJldiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19zbG9wZV9wcmV2KQpsbV9zbG9wZV9wcmV2X2N0cmwgJT4lIHN1bW1hcnkoKQpsbV9zbG9wZV9wcmV2X2N0cmwgJT4lIGNvbmZpbnQobGV2ZWw9MC45KQoKCmBgYAoKIyMgUHJlZGljdCBwcmV2YWxlbmNlIHNsb3BlcyB3aXRoIGNlbnNvcmVkIHJlZ3Jlc3Npb24KYGBge3J9CgojIHByZWRpY3Qgc2xvcGVzIGZyb20gcGVyc29uYWxpdHkKdG9iaXRfc2xvcGVfcHJldiA8LSBjZW5zUmVnKHNsb3BlX3ByZXYgfiBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG1pbihkZl91c19zbG9wZV9wcmV2X2NlbnMkc2xvcGVfcHJldiksIHJpZ2h0ID0gSW5mLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX3Nsb3BlX3ByZXZfY2VucykKdG9iaXRfc2xvcGVfcHJldiAlPiUgc3VtbWFyeSgpCnRvYml0X3Nsb3BlX3ByZXYgJT4lIGNvbmZpbnQobGV2ZWw9MC45KQoKIyBwcmVkaWN0IHNsb3BlcyBmcm9tIHBlcnNvbmFsaXR5IHdpdGggY29udHJvbHMKdG9iaXRfc2xvcGVfcHJldl9jdHJsIDwtIGNlbnNSZWcoc2xvcGVfcHJldiB+IHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0X2Rpc3RhbmNlICsgcmVwdWJsaWNhbiArIG1lZGFnZSArIG1hbGUgKyBwb3BkZW5zICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0ICsgdG91cmlzbSArIGFjYWRlbWljcyArIG1lZGluYyArIHBoeXNpY2lhbl9wYyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25zZXRfcHJldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG1pbihkZl91c19zbG9wZV9wcmV2X2NlbnMkc2xvcGVfcHJldiksIHJpZ2h0ID0gSW5mLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX3Nsb3BlX3ByZXZfY2VucykKdG9iaXRfc2xvcGVfcHJldl9jdHJsICU+JSBzdW1tYXJ5KCkKdG9iaXRfc2xvcGVfcHJldl9jdHJsICU+JSBjb25maW50KGxldmVsPTAuOSkKCmBgYAoKIyMjIENSRiBwcmVkaWN0aW5nIHNsb3BlcwpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfc2xvcGVfcHJldiA8LSBjZm9yZXN0KHNsb3BlX3ByZXYgfiBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydF9kaXN0YW5jZSArIHJlcHVibGljYW4gKyBtZWRhZ2UgKyBtYWxlICsgcG9wZGVucyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51ZmFjdCArIHRvdXJpc20gKyBhY2FkZW1pY3MgKyBtZWRpbmMgKyBwaHlzaWNpYW5fcGMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25zZXRfcHJldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX3Nsb3BlX3ByZXYsIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9zbG9wZV9wcmV2X3ZhcmltcCA8LSB2YXJpbXAoY3JmX3Nsb3BlX3ByZXYsIG5wZXJtID0gMSkKY3JmX3Nsb3BlX3ByZXZfdmFyaW1wX2NvbmQgPC0gdmFyaW1wKGNyZl9zbG9wZV9wcmV2LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9zbG9wZV9wcmV2X3ZhcmltcApjcmZfc2xvcGVfcHJldl92YXJpbXAgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX3Nsb3BlX3ByZXZfdmFyaW1wX2NvbmQKY3JmX3Nsb3BlX3ByZXZfdmFyaW1wX2NvbmQgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCgojIyBQcmVkaWN0IFNvY2lhbCBEaXN0YW5jaW5nCiMjIyBDaGFuZ2UgcG9pbnQgYW5hbHlzaXMKYGBge3J9CgojIGtlZXAgb25seSBjb3VudGllcyB3aXRoIGZ1bGwgZGF0YQpmaXBzX2NvbXBsZXRlIDwtIGRmX3VzX3NvY2Rpc3Rfc2NhbGVkICU+JSAKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lIAogIHN1bW1hcml6ZShuID0gbigpKSAlPiUgCiAgZmlsdGVyKG49PW1heCguJG4pKSAlPiUgCiAgLiRjb3VudHlfZmlwcwoKIyBydW4gY2hhbmdlcG9pbnQgYW5hbHlzaXMKZGZfdXNfc29jZGlzdF9jcHRfcmVzdWx0cyA8LSBkZl91c19zb2NkaXN0X3NjYWxlZCAlPiUgCiAgc2VsZWN0KGNvdW50eV9maXBzLCBzb2NkaXN0X3NpbmdsZV90aWxlKSAlPiUKICBmaWx0ZXIoY291bnR5X2ZpcHMgJWluJSBmaXBzX2NvbXBsZXRlKSAlPiUgCiAgc3BsaXQoLiRjb3VudHlfZmlwcykgJT4lCiAgbWFwKH4gY3B0Lm1lYW52YXIoYXMudmVjdG9yKC4kc29jZGlzdF9zaW5nbGVfdGlsZSksCiAgICAgICAgICAgICAgICAgICAgI3BlbmFsdHkgPSAnQXN5bXB0b3RpYycsCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICBwYXJhbS5lc3RpbWF0ZXM9VFJVRSwKICAgICAgICAgICAgICAgICAgICBRPTEsCiAgICAgICAgICAgICAgICAgICAgdGVzdC5zdGF0ID0gJ05vcm1hbCcpKQoKZGZfdXNfc29jZGlzdF9jcHRfcmVzdWx0c18yIDwtIGRmX3VzX3NvY2Rpc3Rfc2NhbGVkICU+JSAKICBzZWxlY3QoY291bnR5X2ZpcHMsIHNvY2Rpc3RfdGlsZXMpICU+JQogIGZpbHRlcihjb3VudHlfZmlwcyAlaW4lIGZpcHNfY29tcGxldGUpICU+JSAKICBzcGxpdCguJGNvdW50eV9maXBzKSAlPiUKICBtYXAofiBjcHQubWVhbnZhcihhcy52ZWN0b3IoLiRzb2NkaXN0X3RpbGVzKSwKICAgICAgICAgICAgICAgICAgICAjcGVuYWx0eSA9ICdBc3ltcHRvdGljJywKICAgICAgICAgICAgICAgICAgICBjbGFzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgIHBhcmFtLmVzdGltYXRlcz1UUlVFLAogICAgICAgICAgICAgICAgICAgIFE9MSwKICAgICAgICAgICAgICAgICAgICB0ZXN0LnN0YXQgPSAnTm9ybWFsJykpCgojIGNhbGN1bGF0ZSBjaGFuZ2UgcG9pbnQKZGZfdXNfc29jZGlzdF9jcHRfZGF5IDwtIGRmX3VzX3NvY2Rpc3RfY3B0X3Jlc3VsdHMgJT4lIAogIG1hcChjcHRzKSAlPiUgCiAgdW5saXN0KCkgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcmVuYW1lKGNwdF9kYXlfc29jZGlzdCA9ICcuJykgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCdjb3VudHlfZmlwcycpCgpkZl91c19zb2NkaXN0X2NwdF9kYXlfMiA8LSBkZl91c19zb2NkaXN0X2NwdF9yZXN1bHRzXzIgJT4lIAogIG1hcChjcHRzKSAlPiUgCiAgdW5saXN0KCkgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcmVuYW1lKGNwdF9kYXlfc29jZGlzdF8yID0gJy4nKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oJ2NvdW50eV9maXBzJykKCiMgY2FsY3VsYXRlIG1lYW4gZGlmZmVyZW5jZXMKZGZfdXNfc29jZGlzdF9jcHRfbWVhbl9kaWZmIDwtIGRmX3VzX3NvY2Rpc3RfY3B0X3Jlc3VsdHMgJT4lIAogIG1hcChwYXJhbS5lc3QpICU+JSAKICBtYXAofiAuJG1lYW4pICU+JSAKICBtYXAofiAuWzJdKSAlPiUgCiAgdW5saXN0KCkgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcmVuYW1lKG1lYW5fZGlmZl9zb2NkaXN0ID0gJy4nKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oJ2NvdW50eV9maXBzJykKCmRmX3VzX3NvY2Rpc3RfY3B0X21lYW5fZGlmZl8yIDwtIGRmX3VzX3NvY2Rpc3RfY3B0X3Jlc3VsdHNfMiAlPiUgCiAgbWFwKHBhcmFtLmVzdCkgJT4lIAogIG1hcCh+IC4kbWVhbikgJT4lIAogIG1hcCh+IC0uWzJdKSAlPiUgCiAgdW5saXN0KCkgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcmVuYW1lKG1lYW5fZGlmZl9zb2NkaXN0XzIgPSAnLicpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbignY291bnR5X2ZpcHMnKQoKIyBjYWxjdWxhdGUgbWVhbnMKZGZfdXNfc29jZGlzdF9tZWFuIDwtIGRmX3VzX3NvY2Rpc3Rfc2NhbGVkICU+JQogIGdyb3VwX2J5KGNvdW50eV9maXBzKSAlPiUKICBzdW1tYXJpemUobWVhbl9zb2NkaXN0ID0gbWVhbihzb2NkaXN0X3NpbmdsZV90aWxlKSkKCmRmX3VzX3NvY2Rpc3RfbWVhbl8yIDwtIGRmX3VzX3NvY2Rpc3Rfc2NhbGVkICU+JQogIGdyb3VwX2J5KGNvdW50eV9maXBzKSAlPiUKICBzdW1tYXJpemUobWVhbl9zb2NkaXN0XzIgPSAtbWVhbihzb2NkaXN0X3RpbGVzKSkKCiMgbWVyZ2Ugd2l0aCBjb3VudHkgZGF0YQpkZl91c19jcHRfc29jZGlzdCA8LSBkZl91c19zb2NkaXN0X3NjYWxlZCAlPiUgCiAgc2VsZWN0KC10aW1lLCAtc29jZGlzdF9zaW5nbGVfdGlsZSwgLXNvY2Rpc3RfdGlsZXMpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIGxlZnRfam9pbihkZl91c19zb2NkaXN0X2NwdF9kYXksIGJ5PSdjb3VudHlfZmlwcycpICU+JQogIGxlZnRfam9pbihkZl91c19zb2NkaXN0X2NwdF9kYXlfMiwgYnk9J2NvdW50eV9maXBzJykgJT4lCiAgbGVmdF9qb2luKGRmX3VzX3NvY2Rpc3RfY3B0X21lYW5fZGlmZiwgYnk9J2NvdW50eV9maXBzJykgJT4lCiAgbGVmdF9qb2luKGRmX3VzX3NvY2Rpc3RfY3B0X21lYW5fZGlmZl8yLCBieT0nY291bnR5X2ZpcHMnKSAlPiUKICBsZWZ0X2pvaW4oZGZfdXNfc29jZGlzdF9tZWFuLCBieT0nY291bnR5X2ZpcHMnKSAlPiUKICBsZWZ0X2pvaW4oZGZfdXNfc29jZGlzdF9tZWFuXzIsIGJ5PSdjb3VudHlfZmlwcycpICU+JQogIGxlZnRfam9pbihzZWxlY3QoZGZfdXNfb25zZXRfcHJldiwgY291bnR5X2ZpcHMsIG9uc2V0X3ByZXYpLCBieT0nY291bnR5X2ZpcHMnKSAlPiUKICBsZWZ0X2pvaW4oc2VsZWN0KGRmX3VzX3Nsb3BlX3ByZXYsIGNvdW50eV9maXBzLCBzbG9wZV9wcmV2KSwgYnk9J2NvdW50eV9maXBzJykgCgojIHN0YW5kYXJkaXplIG1lYW4vdmFyIGRpZmZlcmVuY2VzCmRmX3VzX2NwdF9zb2NkaXN0IDwtIGRmX3VzX2NwdF9zb2NkaXN0ICU+JSAKICBtdXRhdGUobWVhbl9kaWZmX3NvY2Rpc3QgPSBzY2FsZShtZWFuX2RpZmZfc29jZGlzdCksCiAgICAgICAgIG1lYW5fZGlmZl9zb2NkaXN0XzIgPSBzY2FsZShtZWFuX2RpZmZfc29jZGlzdF8yKSwKICAgICAgICAgbWVhbl9zb2NkaXN0ID0gc2NhbGUobWVhbl9zb2NkaXN0KSwKICAgICAgICAgbWVhbl9zb2NkaXN0XzIgPSBzY2FsZShtZWFuX3NvY2Rpc3RfMikpCgojIGhhbmRsZSBjZW5zb3JlZCBkYXRhCmRmX3VzX2NwdF9zb2NkaXN0IDwtIGRmX3VzX2NwdF9zb2NkaXN0ICU+JSAKICBtdXRhdGUoY3B0X2RheV9zb2NkaXN0ID0gaWZlbHNlKGlzLm5hKGNwdF9kYXlfc29jZGlzdCksIGFzLm51bWVyaWMoZGlmZihyYW5nZShkZl91c19zb2NkaXN0JGRhdGUpKSksIGNwdF9kYXlfc29jZGlzdCkpICU+JSAKICBtdXRhdGUoZXZlbnQgPSBpZmVsc2UoY3B0X2RheV9zb2NkaXN0ID49IGFzLm51bWVyaWMoZGlmZihyYW5nZShkZl91c19zb2NkaXN0JGRhdGUpKSksIDAsIDEpKQoKYGBgCgoKYGBge3J9CgpkZl91c19jcHRfc29jZGlzdCRjcHRfZGF5X3NvY2Rpc3QgJT4lIGhpc3QoKQpkZl91c19jcHRfc29jZGlzdCRtZWFuX2RpZmZfc29jZGlzdCAlPiUgaGlzdCgpCmRmX3VzX2NwdF9zb2NkaXN0JG1lYW5fc29jZGlzdCAlPiUgaGlzdCgpCgoKZGZfdXNfY3B0X3NvY2Rpc3QkY3B0X2RheV9zb2NkaXN0XzIgJT4lIGhpc3QoKQpkZl91c19jcHRfc29jZGlzdCRtZWFuX2RpZmZfc29jZGlzdF8yICU+JSBoaXN0KCkKZGZfdXNfY3B0X3NvY2Rpc3QkbWVhbl9zb2NkaXN0XzIgJT4lIGhpc3QoKQoKYGBgCgoKYGBge3J9Cgpmb3IoaSBpbiBoZWFkKGRmX3VzX3NvY2Rpc3RfY3B0X3Jlc3VsdHMsIDUpKXsKICBwbG90KGkpCn0KCmBgYAoKYGBge3J9Cgpmb3IoaSBpbiBoZWFkKGRmX3VzX3NvY2Rpc3RfY3B0X3Jlc3VsdHNfMiwgNSkpewogIHBsb3QoaSkKfQoKYGBgCgojIFByZWRpY3RpbmcgY2hhbmdlIHBvaW50cyB3aXRoIHRpbWUtdG8tZXZlbnQgcmVncmVzc2lvbiAKYGBge3J9CgojIHByZWRpY3QgaGF6YXJkIGZyb20gcGVyc29uYWxpdHkKY294X2NwdF9zb2NkaXN0IDwtIGNveHBoKFN1cnYoY3B0X2RheV9zb2NkaXN0LCBldmVudCkgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uLCAKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX2NwdF9zb2NkaXN0KQpjb3hfY3B0X3NvY2Rpc3QgJT4lIHN1bW1hcnkoKQoKIyBwcmVkaWN0IGhhemFyZCBmcm9tIHBlcnNvbmFsaXR5IHdpdGggY29udHJvbHMKY294X2NwdF9zb2NkaXN0X2N0cmwgPC0gY294cGgoU3VydihjcHRfZGF5X3NvY2Rpc3QsIGV2ZW50KSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydF9kaXN0YW5jZSArIHJlcHVibGljYW4gKyBtZWRhZ2UgKyBtYWxlICsgcG9wZGVucyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51ZmFjdCArIHRvdXJpc20gKyBhY2FkZW1pY3MgKyBtZWRpbmMgKyBwaHlzaWNpYW5fcGMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICBvbnNldF9wcmV2ICsgc2xvcGVfcHJldiAsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19jcHRfc29jZGlzdCkKY294X2NwdF9zb2NkaXN0X2N0cmwgJT4lIHN1bW1hcnkoKQoKYGBgCgojIyMgTGluZWFyIG1vZGVscyBwcmVkaWN0aW5nIG1lYW4gZGlmZmVyZW5jZXMKYGBge3J9CgpsbV9tZWFuZGlmZl9zb2NkaXN0IDwtIGxtKG1lYW5fZGlmZl9zb2NkaXN0IH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24sIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX2NwdF9zb2NkaXN0KQpsbV9tZWFuZGlmZl9zb2NkaXN0ICU+JSBzdW1tYXJ5KCkKbG1fbWVhbmRpZmZfc29jZGlzdCAlPiUgY29uZmludChsZXZlbD0wLjkpCgpsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmwgPC0gbG0obWVhbl9kaWZmX3NvY2Rpc3QgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0X2Rpc3RhbmNlICsgcmVwdWJsaWNhbiArIG1lZGFnZSArIG1hbGUgKyBwb3BkZW5zICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0ICsgdG91cmlzbSArIGFjYWRlbWljcyArIG1lZGluYyArIHBoeXNpY2lhbl9wYyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uc2V0X3ByZXYgKyBzbG9wZV9wcmV2ICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19jcHRfc29jZGlzdCkKbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsICU+JSBzdW1tYXJ5KCkKbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsICU+JSBjb25maW50KGxldmVsPTAuOSkKCgpgYGAKCiMjIyBDUkYgcHJlZGljdGluZyBtZWFuIGRpZmZlcmVuY2UKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX21lYW5kaWZmX3NvY2Rpc3QgPC0gY2ZvcmVzdChtZWFuX2RpZmZfc29jZGlzdCB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0ICsgdG91cmlzbSArIGFjYWRlbWljcyArIG1lZGluYyArIHBoeXNpY2lhbl9wYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX2NwdF9zb2NkaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcCA8LSB2YXJpbXAoY3JmX21lYW5kaWZmX3NvY2Rpc3QsIG5wZXJtID0gMSkKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wX2NvbmQgPC0gdmFyaW1wKGNyZl9tZWFuZGlmZl9zb2NkaXN0LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcApjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXAgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXBfY29uZApjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXBfY29uZCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKIyBQcmVkaWN0aW5nIGNoYW5nZSBwb2ludHMgd2l0aCB0aW1lLXRvLWV2ZW50IHJlZ3Jlc3Npb24gCmBgYHtyfQoKIyBwcmVkaWN0IGhhemFyZCBmcm9tIHBlcnNvbmFsaXR5CmNveF9jcHRfc29jZGlzdF8yIDwtIGNveHBoKFN1cnYoY3B0X2RheV9zb2NkaXN0XzIsIGV2ZW50KSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24sIAogICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfY3B0X3NvY2Rpc3QpCmNveF9jcHRfc29jZGlzdF8yICU+JSBzdW1tYXJ5KCkKCiMgcHJlZGljdCBoYXphcmQgZnJvbSBwZXJzb25hbGl0eSB3aXRoIGNvbnRyb2xzCmNveF9jcHRfc29jZGlzdF9jdHJsXzIgPC0gY294cGgoU3VydihjcHRfZGF5X3NvY2Rpc3RfMiwgZXZlbnQpIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0X2Rpc3RhbmNlICsgcmVwdWJsaWNhbiArIG1lZGFnZSArIG1hbGUgKyBwb3BkZW5zICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0ICsgdG91cmlzbSArIGFjYWRlbWljcyArIG1lZGluYyArIHBoeXNpY2lhbl9wYyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uc2V0X3ByZXYgKyBzbG9wZV9wcmV2ICwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX2NwdF9zb2NkaXN0KQpjb3hfY3B0X3NvY2Rpc3RfY3RybF8yICU+JSBzdW1tYXJ5KCkKCmBgYAoKIyMjIExpbmVhciBtb2RlbHMgcHJlZGljdGluZyBtZWFuIGRpZmZlcmVuY2VzCmBgYHtyfQoKbG1fbWVhbmRpZmZfc29jZGlzdF8yIDwtIGxtKG1lYW5fZGlmZl9zb2NkaXN0XzIgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfY3B0X3NvY2Rpc3QpCmxtX21lYW5kaWZmX3NvY2Rpc3RfMiAlPiUgc3VtbWFyeSgpCmxtX21lYW5kaWZmX3NvY2Rpc3RfMiAlPiUgY29uZmludChsZXZlbD0wLjkpCgpsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmxfMiA8LSBsbShtZWFuX2RpZmZfc29jZGlzdF8yIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydF9kaXN0YW5jZSArIHJlcHVibGljYW4gKyBtZWRhZ2UgKyBtYWxlICsgcG9wZGVucyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51ZmFjdCArIHRvdXJpc20gKyBhY2FkZW1pY3MgKyBtZWRpbmMgKyBwaHlzaWNpYW5fcGMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbnNldF9wcmV2ICsgc2xvcGVfcHJldiAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfY3B0X3NvY2Rpc3QpCmxtX21lYW5kaWZmX3NvY2Rpc3RfY3RybF8yICU+JSBzdW1tYXJ5KCkKbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsXzIgJT4lIGNvbmZpbnQobGV2ZWw9MC45KQoKCmBgYAoKIyMjIENSRiBwcmVkaWN0aW5nIG1lYW4gZGlmZmVyZW5jZQpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfbWVhbmRpZmZfc29jZGlzdF8yIDwtIGNmb3Jlc3QobWVhbl9kaWZmX3NvY2Rpc3RfMiB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0ICsgdG91cmlzbSArIGFjYWRlbWljcyArIG1lZGluYyArIHBoeXNpY2lhbl9wYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX2NwdF9zb2NkaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcCA8LSB2YXJpbXAoY3JmX21lYW5kaWZmX3NvY2Rpc3RfMiwgbnBlcm0gPSAxKQpjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXBfY29uZCA8LSB2YXJpbXAoY3JmX21lYW5kaWZmX3NvY2Rpc3RfMiwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfbWVhbmRpZmZfc29jZGlzdF92YXJpbXAKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wX2NvbmQKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wX2NvbmQgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCiMjIyBFeHBvcnQgZGF0YSAKYGBge3J9CnVzX2xpc3RfcmVzdWx0cyA8LSBsaXN0KGNveF9vbnNldF9wcmV2LCBjb3hfb25zZXRfcHJldl9jdHJsLCAKICAgICBsbV9zbG9wZV9wcmV2LCBsbV9zbG9wZV9wcmV2X2N0cmwsIAogICAgIGNveF9jcHRfc29jZGlzdCwgY294X2NwdF9zb2NkaXN0X2N0cmwsCiAgICAgbG1fbWVhbmRpZmZfc29jZGlzdCwgbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsLAogICAgIGNveF9jcHRfc29jZGlzdF8yLCBjb3hfY3B0X3NvY2Rpc3RfY3RybF8yLAogICAgIGxtX21lYW5kaWZmX3NvY2Rpc3RfMiwgbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsXzIpCgpyZXN1bHRzX25hbWVzIDwtIGxpc3QoJ2NveF9vbnNldF9wcmV2JywgJ2NveF9vbnNldF9wcmV2X2N0cmwnLCAKICAgICAnbG1fc2xvcGVfcHJldicsICdsbV9zbG9wZV9wcmV2X2N0cmwnLCAKICAgICAnY294X2NwdF9zb2NkaXN0JywgJ2NveF9jcHRfc29jZGlzdF9jdHJsJywgCiAgICAgJ2xtX21lYW5kaWZmX3NvY2Rpc3QnLCAnbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsJywKICAgICAnY294X2NwdF9zb2NkaXN0XzInLCAnY294X2NwdF9zb2NkaXN0X2N0cmxfMicsCiAgICAgJ2xtX21lYW5kaWZmX3NvY2Rpc3RfMicsICdsbV9tZWFuZGlmZl9zb2NkaXN0X2N0cmxfMicpCgpuYW1lcyh1c19saXN0X3Jlc3VsdHMpIDwtIHJlc3VsdHNfbmFtZXMKCnNhdmUodXNfbGlzdF9yZXN1bHRzLCBmaWxlPSJ1c19saXN0X3Jlc3VsdHMuUkRhdGEiKQoKYGBgCgpgYGB7cn0Kd3JpdGVfY3N2KGRmX3VzX3Nsb3BlX3ByZXYsICcvVXNlcnMvaHAyNTAwL0dvb2dsZSBEcml2ZS9TVFVEWS9Db2x1bWJpYS9SZXNlYXJjaC9Db3JvbmEvRGVsaXZlcnkvZGZfdXNfc2xvcGVfcHJldi5jc3YnKQp3cml0ZV9jc3YoZGZfdXNfY3B0X3NvY2Rpc3QsICcvVXNlcnMvaHAyNTAwL0dvb2dsZSBEcml2ZS9TVFVEWS9Db2x1bWJpYS9SZXNlYXJjaC9Db3JvbmEvRGVsaXZlcnkvZGZfdXNfY3B0X3NvY2Rpc3QuY3N2JykKCmBgYAoK